精华内容
下载资源
问答
  • 前言在使用 PHP 在 PDF 文件上打水印的过程中,我尝试了如下几个工具:因为想满足对中文水印的支持,并对 PDF 文档进行加密,最终使用 FPDI + TCPDF 的方案完成功能。正文打水印类...

    前言

    在使用 PHP 在 PDF 文件上打水印的过程中,我尝试了如下几个工具:

    因为想满足对中文水印的支持,并对 PDF 文档进行加密,最终使用 FPDI + TCPDF 的方案完成功能。

    正文

    打水印类1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76

    77

    78

    79

    80

    81

    82

    83

    84

    85

    86

    87

    88

    89

    90

    91

    92

    93

    94

    95

    96

    97

    98

    99

    100

    101

    102

    103

    104

    105

    106require_once ('./fpdi/TCPDF/tcpdf.php');

    require_once('./fpdi/fpdi.php');

    class extends FPDI{

    protected $angle = 0;

    protected $extgstates = array();

    public function __construct(){

    parent::__construct();

    }

    /**

    * 旋转角度

    * @param $angle

    * @param int $x

    * @param int $y

    */

    protected function _rotate($angle, $x=-1, $y=-1){

    if ($x == -1)

    $x == $this->x;

    if ($y == -1)

    $y == $this->y;

    if ($this->angle != 0)

    $this->_out('Q');

    $this->angle = $angle;

    if ($angle != 0) {

    $angle *= M_PI / 180;

    $c = cos($angle);

    $s = sin($angle);

    $cx = $x * $this->k;

    $cy = ($this->h - $y) * $this->k;

    $this->_out(sprintf('q %.5F %.5F %.5F %.5F %.2F %.2F cm 1 0 0 1 %.2F %.2F cm',$c,$s,-$s,$c,$cx,$cy,-$cx,-$cy));

    }

    }

    /**

    * 旋转文字角度

    * @param $x

    * @param $y

    * @param $txt

    * @param $angle

    */

    public function RotatedText($x, $y, $txt, $angle)

    {

    $this->_rotate($angle,$x,$y);

    $this->Text($x,$y,$txt);

    $this->_rotate(0);

    }

    /**

    * 旋转图片角度

    * @param $file

    * @param $x

    * @param $y

    * @param $w

    * @param $h

    * @param $angle

    */

    public function RotatedImage($file, $x, $y, $w, $h, $angle)

    {

    //Image rotated around its upper-left corner

    $this->_rotate($angle,$x,$y);

    $this->Image($file,$x,$y,$w,$h);

    $this->_rotate(0);

    }

    /**

    * 设置字体颜色

    * @param $hexStr

    */

    public function SetTextColorByHexStr($hexStr){

    $rgbArray = $this->_hex2rgb($hexStr);

    if (is_array($rgbArray)) {

    $this->SetTextColor($rgbArray['red'], $rgbArray['green'], $rgbArray['blue']);

    }

    }

    /**

    * 16进制颜色代码转RGB值

    * @param string $hexStr (hexadecimal color value)

    * @param boolean $returnAsString (if set true, returns the value separated by the separator character. Otherwise returns associative array)

    * @param string $seperator (to separate RGB values. Applicable only if second parameter is true.)

    * @return array or string (depending on second parameter. Returns False if invalid hex color value)

    */

    protected function _hex2rgb($hexStr, $returnAsString = false, $seperator = ','){

    $hexStr = preg_replace("/[^0-9A-Fa-f]/", '', $hexStr); // Gets a proper hex string

    $rgbArray = array();

    if (strlen($hexStr) == 6) { //If a proper hex code, convert using bitwise operation. No overhead... faster

    $colorVal = hexdec($hexStr);

    $rgbArray['red'] = 0xFF & ($colorVal >> 0x10);

    $rgbArray['green'] = 0xFF & ($colorVal >> 0x8);

    $rgbArray['blue'] = 0xFF & $colorVal;

    } elseif (strlen($hexStr) == 3) { //if shorthand notation, need some string manipulations

    $rgbArray['red'] = hexdec(str_repeat(substr($hexStr, 0, 1), 2));

    $rgbArray['green'] = hexdec(str_repeat(substr($hexStr, 1, 1), 2));

    $rgbArray['blue'] = hexdec(str_repeat(substr($hexStr, 2, 1), 2));

    } else {

    return false; //Invalid hex color code

    }

    return $returnAsString ? implode($seperator, $rgbArray) : $rgbArray; // returns the rgb string or the associative array

    }

    }

    继承顺序

    程序依赖 FPDI 读取已存在的 PDF 文档,依赖 TCPDF 处理 PDF 文档。程序继承顺序如下:Pdf_Watermark extends FPDI

    FPDI extends FPDF_TPL

    FPDF_TPL extends fpdi_bridge

    fpdi_bridge 根据引入的类是 TCPDF 还是 FPDF 进行选择继承

    因此,在使用 FPDI 读取文件后,可以选择使用 TCPDF 或 FPDF 对文档进行处理。

    调用方法1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59require_once('PdfWatermark.php');

    function pdf_set_watermark_text($file, $newFile, $text, $text_color, $font_style, $font_size, $alpha, $margin_left, $margin_top, $angle){

    try {

    $pdf = new Pdf_Watermark();

    $pageCount = $pdf->setSourceFile($file);

    // 循环读取分页

    for ($i = 1; $i <= $pageCount; $i++) {

    // 加密文档

    $pdf->SetProtection(array('print', 'modify', 'copy', 'annot-forms'));

    $pdf->addPage();

    $tplidx = $pdf->importPage($i);

    // 获取 pdf 长宽

    $whArray = $pdf->getTemplateSize($tplidx);

    $pdfWidth = $whArray['w'];

    $pdfHeight = $whArray['h'];

    // 如果将最后一个参数 $adjustPageSize 设置为TRUE,则当前的pdf页面大小会根据模板自适应。

    $pdf->useTemplate($tplidx, null, null, 0, 0, TRUE);

    for ($j = 0; $j < 9; $j++) {

    // 设置字体

    $pdf->SetFont('helvetica', 'B', $font_size);

    $pdf->SetAlpha($alpha);

    // 设置文字颜色

    $pdf->SetTextColorByHexStr($text_color);

    // 设置文字位置

    $pdf->RotatedText($margin_left+$j*30, $margin_top+$j*30, $text, $angle);

    $pdf->SetAlpha(1);

    }

    }

    // pdf文档在浏览器中输出显示

    $pdf->Output($newFile, 'I');

    } catch (Exception $ex) {

    return false;

    }

    return true;

    }

    $pdfFile = 'test.pdf';

    $newFile = 'word.pdf';

    $watermark_text = 'abc';

    $text_color = '#CFCFCF';

    $font_style = 'B';

    $font_size = 25;

    $alpha = 0.5;

    $margin_left = 10;

    $margin_top = 10;

    $angle = 45;

    pdf_set_watermark_text($pdfFile, $newFile, $watermark_text, $text_color, $font_style, $font_size, $alpha, $margin_left, $margin_top, $angle);

    FPDI的限制

    FPDI 的免费版本只能读取版本 <1.5 的 pdf 文档,为了兼容所有的 pdf 文档需要做一些处理。

    如果不在乎 money,可以直接使用付费工具 FPDI PDF-Parser 来解决这个问题。

    我在这里选择了使用 PDFtk 命令行工具,通过在 PHP 中执行如下代码对 pdf 文档进行处理:1exec("pdftk input_file.pdf output output_file.pdf");

    这样,处理过后的 output_file.pdf 就能使用上诉方法添加水印了。

    关于中文显示

    新版本的 TCPDF 已支持中文,在 TCPDF/fonts 目录下存在 cid0cs.php 与 stsonstdlight.php 均能有效支持中文显示。

    可以使用 setFont 方法进行调用:1

    2// 设置字体

    $pdf->SetFont('cid0cs', '', $font_size);1

    2// 设置字体

    $pdf->SetFont('stsongstdlight', '', $font_size);

    总结

    在研究给 PDF 文档打水印的过程中一波三折。

    因为一开始选用的 FPDF 不支持 utf-8 编码,转战 TFPDF 开始捣鼓中文字体包,最终因为需要加密文档选择了更加方便的 TCPDF。

    总的来说,开发前还是要仔细阅读参考文档啊,泪目。

    参考资料

    展开全文
  • 为了快速将纸质的文档转换成PDF电子版,我们经常会使用一些有扫描功能的软件直接生成的PDF,但是常用的几款都会在右下角留下水印,这种应该如何删除呢?由于扫描后的PDF文档都是图片样式的,直接编辑肯定是不现实了...

    为了快速将纸质的文档转换成PDF电子版,我们经常会使用一些有扫描功能的软件直接生成的PDF,但是常用的几款都会在右下角留下水印,这种应该如何删除呢?

    由于扫描后的PDF文档都是图片样式的,直接编辑肯定是不现实了,而如果用专业的PS类软件一般人没接触过肯定很难操作,下面分享一个简单好用的方法。

    首先我们用极速PDF阅读器打开这个PDF文档后,使用快捷键Ctrl+N切换到注释页面,或直接点击左上角导航栏中的“注释”切换;

    bda16c9f3e0f6b14dbe887e2dbece8c4.png

    接着选择注释工具栏左上角中的“画笔”这个注释工具(快捷键Ctrl+Shift+P),然后页面左上角会出现这个设置窗口,将线条调整为“直线”,根据水印大小选择线条的粗细,重点是一定要将透明度调整到100%,否则无法覆盖文字。

    f80c91b31be797965e3001bb7b8538ec.png

    接着点击颜色选项卡右下角的“白色”可以打开颜色调色盘,选择一个跟文档背景色一样的颜色,一般的文档都是像我们现在的白色背景色,那么直接选择白色就可以了。

    1ba823cce335a04e3b633b9d9e9a317c.png

    在右下角的水印处单击鼠标进行涂抹,直到完全覆盖掉整个水印部分就可以啦。

    6123ad1a284d01ec698ffed5fd622412.png

    如果在操作过程中不小心误涂抹了正文内容,直接在对应的位置单击鼠标右键并撤销或删除掉注释即可。

    8e11ec56b961a1310b3d420fe4860e96.png

    当然最后操作完成之后一定要记得保存哦,点击左上角工具栏的“保存”键就可以啦。

    ce8212705474d146f0ad6ae28655d092.png
    展开全文
  • python实现GIF生成工具

    热门讨论 2021-02-08 21:32:37
    今天在写文章的时候,需要合成一张Gif动图,结果之前一直使用的在线Gif工具居然要收费了,否则就得加水印,而且水印巨大无比,挡住主要内容了。于是就去github上找了一圈,结果没有找到理想的工具,基本上是使用文档...

    今天在写文章的时候,需要合成一张Gif动图,结果之前一直使用的在线Gif工具居然要收费了,否则就得加水印,而且水印巨大无比,挡住主要内容了。于是就去github上找了一圈,结果没有找到理想的工具,基本上是使用文档不清晰,或者不支持自定义输入参数。不过也没白逛,扫了一眼代码,发现生成Gif的方法非常简单,所有就决定自己写了一个。

    代码已上传到github: https://github.com/youlanhai/makegif

    用法

    python makegif.py 后面输入图片文件路径或文件夹,即可合成gif图片。本脚本支持python2和python3,需要先安装Pillow插件: pip install Pillow。Windows用户还可以直接把图片路径或文件夹,拖拽到makegif.bat上面即可。

    用法1:输入多个图片,自动在图片父目录下生成一张input.gif

    python makegif.py input/1.png input/2.png input/3.png
    

    用法2: 输入图片文件夹,工具会收集input文件夹下的所有图片,然后合成gif,输出为input.gif

    python makegif.py input
    

    完整参数:

    usage: makegif.py [-h] [-d DURATION] [-o OUTPUT] [-f FILTERS] [-s SIZE]
                      [-l LOOP]
                      inputs [inputs ...]
    
    创建gif图片
    
    positional arguments:
      inputs                输入文件路径,或文件夹。支持混合输入
    
    optional arguments:
      -h, --help            show this help message and exit
      -d DURATION, --duration DURATION
                            时间间隔。默认200ms
      -o OUTPUT, --output OUTPUT
                            输出路径。如果未指定,则使用第一个图片所在的文件夹作为名称。如果文件夹为当前路径,则输出名称为out.git
      -f FILTERS, --filters FILTERS
                            用于在文件夹中搜索指定的后缀文件。默认: png,jpg,bmp
      -s SIZE, --size SIZE  输出图片大小。格式: 640x480; 或者640x,仅限定宽度为640,高度等比缩放;
                            或者x480,仅限定高度为480,宽度等比缩放
      -l LOOP, --loop LOOP  循环次数。默认0,表示无限循环
    

    实现说明

    核心点就一个函数,调用PIL.Image的save方法,传入gif需要的参数即可:

    images = [PIL.Image.open(path) for path in inputs]
    images[0].save(output_path, save_all = True, duration = 200, loop = 0, append_images = images[1:])
    
    参数 说明
    output_path 输出路径,必须是.gif后缀
    save_all 保存所有后续的序列帧。必须为True
    duration gif播放间隔,单位为毫秒
    loop 播放的循环次数。0表示无限循环;不传表示不循环
    append_images 后续的序列帧

    脚本剩余功能主要是参数处理,和路径处理。

    参考

    pillow文档-PIL.Image.save

    展开全文
  • 豆丁当当,万能的文档文库下载工具,豆丁当当万能文档下载器,可以免积分无需登录免费下载百度和豆丁等文库文档,它目前支持百度、豆丁、book118、mbalib、悦读网、畅享网、大桔灯、金字塔医学网站。它可以对豆丁网...
  • Java实现在线word文档添加铺满效果文字水印,文字可换行使用插件Aspose.words for java生成水印工具类调用生成水印方法 需求:为在线预览的word文档添加自定义水印,还要铺满效果,文字太多还要能换行 使用插件...

    Java实现在线word文档添加铺满效果文字水印,文字可换行


    需求:为在线预览的word文档添加自定义水印,还要铺满效果,文字太多还要能换行

    使用插件Aspose.words for java

    一个jar包,官网下载或者复制相应的dependency语句即可,专门处理开发过程中的word文档的工具,功能挺强大,但是需要先破解,破解的关键就是把注册license的源码给删了,网上破解教程不多,且都大同小异,反正我是破解成功了,你们也可以的!
    最后把破解完的jar包通过适合你自己的方式导入到依赖里即可
    (为什么说适合你的方式呢?因为我无法直接在pom文件里导入官网的dependency,公司有限制,只能导入公司仓库里已有的版本…)

    生成水印的工具类

    想实现文字水印换行需要在调用工具类方法时在水印文本中加"\n"换行符,然后修改下面这个生成文字形状的方法,调整水印的宽高,换行后宽度变小,高度变大。
    watermark.setHeight(WATERMARK_FONT_HEIGHT*3); //WATERMARK_FONT_HEIGHT是一行文字的高度,我水印分了三行,所以最终水印高度 * 3,如果还不满意,也可以改WATERMARK_FONT_HEIGHT

    /**
         * 构建文字shape类
         *
         * @param doc           文档对象
         * @param watermarkText 水印文字
         * @param left          左边距
         * @param top           上边距
         * @throws Exception 
         */
        private static Shape buildTextShape(Document doc, String watermarkText, double left, double top) throws Exception {
            Shape watermark = new Shape(doc, ShapeType.TEXT_PLAIN_TEXT);
            watermark.getTextPath().setText(watermarkText);
            watermark.getTextPath().setFontFamily("宋体");
            watermark.setWidth(watermarkText.length() * (double)WATERMARK_FONT_WIDTH);
            watermark.setHeight(WATERMARK_FONT_HEIGHT*3); //WATERMARK_FONT_HEIGHT是一行文字的高度,我水印分了三行,所以最终水印高度*3
            watermark.setRotation(WATERMARK_FONT_ROTATION);
            //绘制水印颜色
            watermark.getFill().setColor(watermark_color);
            watermark.setStrokeColor(watermark_color);
            //将水印放置在页面中心
            watermark.setLeft(left);
            watermark.setTop(top);
            watermark.setWrapType(WrapType.NONE);
            return watermark;
        }
    

    完整工具类,包括文字和图片水印的生成

    import com.aspose.words.*;
    import com.aspose.words.Shape;
    import org.apache.commons.lang3.StringUtils;
    
    
    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.util.Random;
    
    /**
     * 水印工具类
     */
    public class WatermarkUtils {
    
        /**
         * 水印每个字体的宽度为10
         */
        private final static int WATERMARK_FONT_WIDTH = 5;
        /**
         * 水印每个字体的高度为16
         */
        private final static int WATERMARK_FONT_HEIGHT = 14;
        /**
         * 水印图片的默认高度为20
         */
        private final static double WATERMARK_IMG_HEIGHT = 20d;
        /**
         * 水印倾斜角度 默认是50 为保证文字连续性尽量不要修改
         */
        private final static int WATERMARK_FONT_ROTATION = 50;
        /**
         * 水印字体颜色
         */
        private static Color watermark_color = new Color(217, 226, 243);
    
        /**
         * word文档插入图片水印
         *
         * @param doc     文档对象
         * @param imgPath 图片路径
         * @throws Exception 
         */
        public static void insertWatermarkImg(Document doc, String imgPath) throws Exception {
            if (StringUtils.isBlank(imgPath)) {
                System.out.println("没有配置水印图片, 无法为文档加入水印");
                return;
            }
            Paragraph watermarkPara = new Paragraph(doc);
            // TODO 这里的数据 计算水印个数(900 150 700 150) 首个水印位置(-200至-100)都是实验得到 没有理论依据
            for (int top = 0; top < 900; top += 150) {
                int beginLeft = new Random().ints(-100, -50).limit(1).findFirst().getAsInt();
                for (int left = beginLeft; left < 700; left += 150) {
                    Shape waterShape = buildImgShape(doc, imgPath, left, top);
                    watermarkPara.appendChild(waterShape);
                }
            }
            // 在每个部分中,最多可以有三个不同的标题,因为我们想要出现在所有页面上的水印,插入到所有标题中。
            for (Section sect : doc.getSections()) {
                // 每个区段可能有多达三个不同的标题,因为我们希望所有页面上都有水印,将所有的头插入。
                insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_PRIMARY);
                insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_FIRST);
                insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_EVEN);
            }
        }
    
        /**
         * 构建图片shape类
         *
         * @param doc     文档对象
         * @param imgPath 图片文件路径
         * @param left    左边距
         * @param top     上边距
         */
        private static Shape buildImgShape(Document doc, String imgPath, int left, int top) {
            Shape shape = new Shape(doc, ShapeType.IMAGE);
            try {
    //            File imgFile = new File(imgPath);
    //            BufferedImage sourceImg = ImageIO.read(new FileInputStream(imgFile));
                BufferedImage sourceImg = ImageIO.read(new WatermarkUtils().getClass().getResourceAsStream(imgPath));
                double multiple = sourceImg.getHeight() / WATERMARK_IMG_HEIGHT;
    //            shape.setWidth(sourceImg.getWidth() / multiple);
    //            System.out.println(sourceImg.getWidth() / multiple);
    //            shape.setHeight(WATERMARK_IMG_HEIGHT);
                shape.getImageData().setImage(sourceImg);
                shape.setWidth(50);
                shape.setHeight(20);
                shape.setRotation(WATERMARK_FONT_ROTATION);
                shape.setLeft(left);
                shape.setTop(top);
                shape.setWrapType(WrapType.NONE);
            } catch (Exception e) {
                throw new RuntimeException("图片附件丢失, 无法生成水印!", e);
            }
            return shape;
        }
    
        /**
         * 为word文档插入文本水印
         *
         * @param doc           文档对象
         * @param watermarkText 文本内容
         * @throws Exception 
         */
         public static void insertWatermarkText(Document doc, String watermarkText) throws Exception {
            if (StringUtils.isBlank(watermarkText)) {
                System.out.println("没有配置水印内容, 无法为文档加入水印");
                return;
            }
            Paragraph watermarkPara = new Paragraph(doc);
            // TODO 这里的数据 计算水印个数(900 150 700 150) 首个水印位置(-200至-100)都是实验得到 没有理论依据
            for (int top = 0; top < 900; top += 300) {
                int beginLeft = new Random().ints(-400, -200).limit(1).findFirst().getAsInt();
                for (int left = beginLeft; left < 700; left += 300) {
                    // 如果是左起第一个水印则通过字符串截取达到随机显示水印的目的
                    // 这样做的原因为了保证倾斜的行保证对齐 又能表现随机的特性 不是好办法
                    if (left == beginLeft) {
                        int splitNo = new Random().ints(0, watermarkText.length()).limit(1).findFirst().getAsInt();
                        String firstWater = watermarkText.substring(splitNo) + "                                            ".substring(0, splitNo);
                        Shape waterShape = buildTextShape(doc, firstWater, left, top);
                        watermarkPara.appendChild(waterShape);
                    } else {
                        Shape waterShape = buildTextShape(doc, watermarkText, left, top);
                        watermarkPara.appendChild(waterShape);
                    }
                }
            }
    
            // 在每个部分中,最多可以有三个不同的标题,因为我们想要出现在所有页面上的水印,插入到所有标题中。
            for (Section sect : doc.getSections()) {
                // 每个区段可能有多达三个不同的标题,因为我们希望所有页面上都有水印,将所有的头插入。
                insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_PRIMARY);
                insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_FIRST);
                insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_EVEN);
            }
    
        }
    
        /**
         * 构建文字shape类
         *
         * @param doc           文档对象
         * @param watermarkText 水印文字
         * @param left          左边距
         * @param top           上边距
         * @throws Exception 
         */
        private static Shape buildTextShape(Document doc, String watermarkText, double left, double top) throws Exception {
            Shape watermark = new Shape(doc, ShapeType.TEXT_PLAIN_TEXT);
            watermark.getTextPath().setText(watermarkText);
            watermark.getTextPath().setFontFamily("宋体");
            watermark.setWidth(watermarkText.length() * (double)WATERMARK_FONT_WIDTH);
            watermark.setHeight(WATERMARK_FONT_HEIGHT*3);
            watermark.setRotation(WATERMARK_FONT_ROTATION);
            //绘制水印颜色
            watermark.getFill().setColor(watermark_color);
            watermark.setStrokeColor(watermark_color);
            //将水印放置在页面中心
            watermark.setLeft(left);
            watermark.setTop(top);
            watermark.setWrapType(WrapType.NONE);
            return watermark;
        }
    
        /**
         * 插入水印
         *
         * @param watermarkPara 水印段落
         * @param sect          部件
         * @param headerType    头标类型字段
         * @throws Exception 
         */
        private static void insertWatermarkIntoHeader(Paragraph watermarkPara, Section sect, int headerType) throws Exception {
            HeaderFooter header = sect.getHeadersFooters().getByHeaderFooterType(headerType);
            if (header == null) {
                header = new HeaderFooter(sect.getDocument(), headerType);
                sect.getHeadersFooters().add(header);
            }
            header.appendChild(watermarkPara.deepClone(true));
        }
    }
    

    调用生成水印方法

    在生成在线文档的方法中调用生成水印的方法

    //aspose.words加水印,破解后想用,需要先获取license
    if(!getLicense()) {
    	throw new Exception("com.aspose.words lic ERROR!");
    }
    Document document = new Document(路径"temp.docx");
    WatermarkUtils.insertWatermarkText(document, txt); //调用工具类方法,txt是水印文字
    document.protect(ProtectionType.READ_ONLY);  //设置只读,其实我用着没效果
    document.save(路径"temp.docx"); //最后必须保存
    
    
    /**
    * 获取license
     * 
     * @return
     */
     public static boolean getLicense() {
        boolean result = false;
        try {
        	InputStream license = Rmbdyyl.class.getClassLoader().getResourceAsStream("license.xml");// license路径
            License aposeLic = new License();
            aposeLic.setLicense(license);
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    

    涉及公司机密,效果图就不放了

    展开全文
  • 免费的PDF生成工具

    2006-01-27 19:14:00
    这个工具完全免费,没有水印,也没有广告。试验了几个中文文档和网页,也都很成功,特别推荐给大家。下载的时候不要忘了Free Converter,CutePDF Writer需要这个转换程序才能工作。安装后,会增加一...
  • 批量PDF加入水印是一款操作简单, 效果显著的应用程序。支持为批量PDF 添加水印。批量PDF加入水印功能如下: 1. 支持添加批量PDF,并为其添加...无需安装Adobe Acrobat 阅读器,批量PDF加入水印工具即可生成与Adobe ...
  • API可以轻松用于生成,修改,转换,渲染,保护和打印PDF文档,而无需使用Adobe Acrobat。此外,还提供PDF压缩选项,表格创建和操作,图形和图像功能,广泛的超链接功能,印章和水印任务,扩展的安全控制和自定义字体...
  • 文章目录I、Markdown1.0 插入图片1.0.1 去掉平台水印1.1 表格1.2 合并单元格 (难点)1.2.1 HTML的table表格1.2.2 合并单元格的例子II、csdn平台的markdown版本的问题汇总III、see also3.1 罗马数字 I、Markdown ...
  • 甚至不需要下载软件,非常简单快速,透过在线转档工具直接在浏览器进行,其中比较常碰到的 PDF 转档或是影音剪辑和格式转换,包括合并、编辑、压缩、加密解密、旋转、分割页面、加入水印、提取文件图片等等,有很多...
  • 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 打开vegas pro 16.0 把素材拉到视频轨道,举例红框中的"大手拉小手"是我们要隐去的。看DV论坛帖子讨论较热的方法是复制一层轨道,在复叠层添加...
  • 为了快速将纸质的文档转换成PDF电子版,我们经常会使用一些有扫描功能的软件直接生成的PDF,但是常用的全能扫描王就会在右下角留下水印,这种应该如何删除呢? 由于扫描后的PDF文档都是图片样式的,直接编辑肯定是不...
  • 水印:动态生成水印并将水印添加到现有文档中 标签:将文本标签(例如文件名或日期)覆盖到文档上 加密:密码保护和限制仅打印的权限 旋转:以90度为增量旋转 高档:缩放PDF尺寸 合并:将多个文档合并为一个文件 ...
  • 针对WORD文档的批量处理工具。 【基本介绍】 《Word文档批量处理大师》软件精致小巧,简单易用,针对性强,是特别针对Office办公软件中的Word文档进行批量处理的软件。可针对Word中的绝大多数功能进行批量操作,...
  • 黑科技工具箱V1.4.rar

    2019-05-09 16:47:10
    超级截图工具 | 图片识别文字 | 图片去除水印 | 照片高清处理 | 图片无损放大自动挖图|SN|照片转为代码1寸照片生成器 文件极速搜索冰点文库下载|百度文档下载文本空格处理 重要数据恢夏|WAV与MP3互转电脑录音工具|GF...
  • 世界上最好的压缩与优化技术 ...添加水印或覆盖PDF文档,从而生成新的PDF并输出。 – 是企业文具使用的理想选择 自动生成书签 自动生成页眉/页脚 扩展字体嵌入选项 规范化-创建特定打印机的参数并保存供以后使用
  • PDFdo PDF Text Delete是一款可以将pdf文件内的指定部分文字删除的工具,如果某个PDF中部分文字想删除他,可以使用这款免费的PDF删除文字工具。 软件功能 1 能快速方便的删除PDF...4 对于PDF文档中的文字水印,本页
  • 编辑工具包括注释(文本、带箭头的线条、突出显示)、调整大小、裁剪、锐化、水印、应用边缘效果等等。其他功能包括图像扫描、全局热键、自动文件名生成、外部编辑器支持、颜色拾取工具、屏幕放大镜、屏幕十字准线和...
  • 编辑工具包括注释(文本、带箭头的指示线、突出)、缩放、裁剪、锐化、水印、边缘效果等等。它还允许您记录屏幕活动和声音为高度压缩的视频文件。其他功能包括全局热键、自动生成文件名、支持外部编辑器、颜色选择器...
  • 支持从数码相机、扫描仪、摄像头等设备中连续扫描取图,并将其合成为一个多页的PDF电子文档,可将纸质文件直接转化为电子文档。 7.支持多个图像文件合成一个PDF文件或一个图像文件生成一个PDF文件 支持图像压缩率的...
  • 测试工程师,必备图片测试工具 recommend:China-Gitee,Other-Github 一、优点 简单易上手 开源免费 详细使用文档 提高测试效率 二、功能 批量重命名图片 批量下载图片 修改图片大小 生成不同格式图片 ...
  • 文件定时删除器

    2015-06-19 10:56:05
    在网上发现给几个朋友共享的机密资料,有没有办法给 word 文档加个水印,下回就知道是谁泄露的秘密了?  给客户发一份 excel 格式的报价单,只希望让他看一次就自动... /v :查看 UND 文档水印  /V:查看程序版本
  • 有样儿笔记-crx插件

    2021-04-03 10:43:42
    主要功能:- markdown笔记编辑内容实时保存- 一键备份markdown格式文档- 一键清空markdown文档- 一键导入markdown格式文档- 笔记工具栏快捷键丰富,图表插入,数学公式插入等。- 笔记可以导出PDF文档,支持编辑页眉...
  • 软件还包含一些很好的PDF工具,可以合并文档,拆分文档,提取文档页面,将文档页面复制到其他文档,设置标题、作者等文档属性,为PDF添加密码、签名、水印,将Word、Excel或图像文档转换为PDF,将文档与数码纸合成,...
  • FastReport.Mono_2019.4.3.rar

    2019-12-06 19:34:54
    FastReport Mono是一款为Mono Framework设计的功能全面的报表生成工具。作为一个多平台的报表解决方法,FastReport Mono可以应用于Windows, Linux, Mac OS X,以及任何支持Xamarin Mono的操作系统。有了FastReport ...
  • 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录画图软件系列前言一、origin画图二、使用步骤1.origin出图有水印2.读入数据总结前言一、pandas是什么?二、使用步骤1.引入库2.读入数据...
  • PDF Explorer

    2011-12-04 12:23:54
    PDF Explorer提供了图片提取、文档分割/合并、批量处理以及添加水印等实用工具,笔者觉得其中图片提取和添加水印的功能最为实用。下面就为大家简单介绍一下这两个功能。 在“浏览区”列表中右键单击文件名选择...
  • word中页眉的图片不显示解决办法

    千次阅读 2014-07-28 20:36:45
    项目中生成的word文档,在页眉插入了图片水印,但是打开word之后不显示,打印预览时还是能看到图片的,所以想一定还是word的设置问题,终于找到问题所在,在“工具”-“选项”-“视图”中勾选“图形”即可: ...
  • Solid PDF Tools也是专业的PDF制作、生成工具,它会安装一个PDF虚拟打印机:Solid PDF Creator,能够制作高质量PDF,Word转PDF就又多了一种方法。 Solid PDF Tools还具有OCR文本识别功能,能够使用OCR来识别扫描图像...
  • FastStone Capture.exe

    2020-05-31 11:36:24
    编辑工具包括注释(文本、带箭头的指示线、突出)、缩放、裁剪、锐化、水印、边缘效果等等。它还允许您记录屏幕活动和声音为高度压缩的视频文件。其他功能包括全局热键、自动生成文件名、支持外部编辑器、颜色选择器...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 130
精华内容 52
关键字:

文档水印生成工具