精华内容
下载资源
问答
  • PDF文件的书签批量自动导入和导出 PDFBookmark-Exchanger

    万次阅读 多人点赞 2017-12-06 23:26:48
    2020-01 更新 (ver 1.0.2-final): ---- 修正PDF书签指向的页面位置为相对位置,而不再使用绝对位置。 PDF文件的书签导入和导出...本文介绍了这个软件用于PDF书签的导入、导出、交换。 并提供了物理学、微积...

     

    2020-01 更新 (ver 1.0.2-final):

        ---- 修正PDF书签指向的页面位置为相对位置,而不再使用绝对位置。

     

     

    PDF文件的书签导入和导出 PDFBookmark-Exchanger

     

    摘要

     

        PDF电子书是最流行的格式,可以注释可以带书签目录方便阅读。本文介绍了这个软件用于PDF书签的导入、导出、交换。

    并提供了物理学、微积分的示例PDF书籍供参考。

    此软件需要操作系统安装有JDK或者JRE方能运行, Oracle的官方下面地址点这里JDK

    1 前言

    PDF文件全称portable document format,就是便携文档格式,是所有平台都支持浏览的文档格式。无论你用什么系统,你的屏幕显示和打印输出就是发布者想要的样子。此即“输出一致”。
    在文档打印、论文撰写、信息交流,已经电子书阅读方面,PDF文档使用的越来越普遍。
    PDF文件的书签(或者大纲-Outline) 提供了文档的组织结构,阅读文档时非常方便。
    然而,很多PDF书籍没有书签,而书签功能又是如此重要,比如:

    • 书签导入: 我们经常可以在amazon, JD或者出版社网站上浏览到相应书籍的书签,怎么将这些书签导入相应的PDF文件呢?
    • 书签导出:  从已经有书签的PDF文件中导出书签
    • 书签交换: 同一本书籍的2个不同PDF文件,清晰的文件没有书签,而不清晰的文件则带有书签,怎么方便的在PDF文件之间转移书签呢?

    对于上述的三个简单功能,在网上始终未找到软件能较好提供这些功能,因此自己实现了下述软件: PDFBookmark-Exchanger

     

     

    2 PDFBookmark-Exchanger

    软件基于Java进行开发,可以实现跨平台使用。运行软件必须安装有JRE(Java运行时环境)。软件界面如下:
     
    1) Load: 加载PDF文件并导出书签
    2) Save: 将书签导入到PDF文件中
    3) Open: 打开Text(文本文件)中的书签内容
    4) Store: 保存当前书签内容到文本文件中
    5) 书签页码对应关系设定: 设定书签的页码和实际PDF文件页码的对应关系,默认为1对1

    3 书签的格式

    欲导入和导出的书签格式规定如下:
    1) 每一行代表一个书签

    2) 空行#字符开头的部分做为注释,被自动忽略

    3) 每行书签的格式为: 【0或者多个缩进】【书签名】【多个空白字符】【页码】

    • 书签缩进: 以Tab键或者连续4个空格键或者中文全角空格作为一个子书签缩进,依次类推
    • 书签名: 不能含有3个及以上空格或者Tab键或者#字符
    • 书签名和页码的分隔:至少一个Tab键或者连续4个空格或者连续2个全角空格及以上做为分隔标记

    4) 如果书签内容保存到Text(文本文件)中,则文件必须以UTF-8编码存储

     


     

    4 操作建议

    以导入书签到PDF文件中为例。
    1) 首先从网上找到到书签内容, 如果有页码最好,否则需要自己输入页码。
    2) 输入页码: 将书签内容拷贝到Excel文件中,每行代表一个书签,然后在另外的列中输入书签对应页码
    3) 将书签及页码拷贝到文本编辑器中,例如: Editplus, Notepad++等,使用这些编辑器提供的列选模式,调整缩进和分隔符合上节中的书签格式
    4) 书签的页面往往从1开始,而实际的PDF文件因为包含书籍封面等信息,真实页面和书签页码之间有偏移,打开PDF文件,看看书签中的页面和对应的实际页码是多少,填入软件中。
    5) 点击”Save”按钮即可导入PDF文件中。

     

     

     

     

    5 软件下载及示例

     


    PDFBookmark-Exchanger 链接:https://pan.baidu.com/s/1jIeTsUy 密码: i5un
    (下载后,windows环境点击“run.bat”, Linux环境运行 “run.sh”即可启动软件)

    用此软件制作的带书签PDF文件: (选择后背景反白即可见到提取码)
    (下面的电子书仅做研究之用,请于下载后24小时删除!)

    物理学教科书等(书签带目录): 链接: https://pan.baidu.com/s/1zbuPrL9Fj6NDwuf_IwSwXw 密码: gemg


    朗-@-道//理==论==物理教程(朗道十卷) (书签带目录): 链接:https://pan.baidu.com/s/1c8U7wE 密码:bdtt


    托拖-马码-斯师-微积分等(书签带目录) 链接:https://pan.baidu.com/s/1boUX2Rd 密码:vnqt

     

     

     

    初等代数和初等几何等,适用于中学自学(英文原版):

    链接: https://pan.baidu.com/s/1mQp_Zr65bTz0CfF2hwAw-g 提取码: e6at 

     

     

     

     

    展开全文
  • 1)将功能选择为从PDF书签 2)对相应pdf进行选择 3)点击开始 备注: 3.去掉相应的页码 1)按键盘上的CTRL+A全选,然后按CTRL+C进行复制。​ 2)打开微软的Office软件Excel或者WPS的电子表格进行粘贴(CTRL+...

    目录

    所用软件工具:

    应用场景:

    使用步骤:

    1.打开软件并点击

    2.弹出次级页面窗口进行操作

    1)将功能选择为从PDF取书签

    2)对相应pdf进行选择

    3)点击开始

    备注:

    3.去掉相应的页码

    1)按键盘上的CTRL+A全选,然后按CTRL+C进行复制。​

    2)打开微软的Office软件Excel或者WPS的电子表格进行粘贴(CTRL+V)。​

    3)然后选择整列,并按Delete进行部分页码的删除。

    4)进行剩余部分的页码进行删除

    5)然后在Excel里进行全选,将整理后的书签内容复制到新的txt文件中,即可获得pdf书签目录的完美提取。


    所用软件工具:

    FreePic2Pdf 可关注微信公众号(会熟精绝化)并回复pdf书签即可获得软件的下载地址。

    应用场景:

    在有带书签的PDF,但是想提取相关内容做一个目录的时候。

    使用步骤:

    1.打开软件并点击

    2.弹出次级页面窗口进行操作

    1)将功能选择为从PDF取书签

    2)对相应pdf进行选择

    3)点击开始

    备注:

           点击绿色箭头所指按钮可以选择输出文件夹,也可忽略。操作后在pdf的同目录下会生成一个同名文件夹,txt文件内即为所提取的书签内容,如图所示:

    3.去掉相应的页码

    在进一步操作,由于生成书签内容是按层级生成的并且含有书签所在的页码,若要去掉相应的页码可以在打开txt文本的情况下

    1)按键盘上的CTRL+A全选,然后按CTRL+C进行复制。

    2)打开微软的Office软件Excel或者WPS的电子表格进行粘贴(CTRL+V)。

    3)然后选择整列,并按Delete进行部分页码的删除。

    4)进行剩余部分的页码进行删除

    5)然后在Excel里进行全选,将整理后的书签内容复制到新的txt文件中,即可获得pdf书签目录的完美提取。

     

    感谢您的观看,如果感觉对您有帮助请您点赞并支持一下,为了防止下次找不到本资源可以将本博客收藏到浏览器或者关注本博主,本人爱好学习和分享知识,期待与大家一起进步。

    展开全文
  • Office三件套批量转PDF以及PDF书签读写与加水印

    万次阅读 多人点赞 2021-07-24 00:49:13
    日常工作中,我们经常需要将office三件套,Word、Excel和PPT转换成PDF。...另外,将完成PDF书签的写入和提取以及加水印的操作。 office三件套转换为 PDF 格式 office三件套包括Word、Excel、PowerPoint ,为了调用

    日常工作中,我们经常需要将office三件套,Word、Excel和PPT转换成PDF。当然办公软件自身都带有这样的功能,但当我们需要一次性转换大量的office文件时,用代码就比较方便。

    其实这类代码有其他作者写过,但是呢,要么每个组件用一个库,用么代码没法正常跑。今天呢,我将带大家完全只使用win32调用vba的API来完成这个转换。

    另外,将完成PDF书签的写入和提取操作以及批量加水印的操作。关于水印我们可以加背景底图水印或悬浮文字水印。

    本文目录:

    office三件套转换为 PDF 格式

    office三件套包括Word、Excel、PowerPoint ,为了调用office程序自身的API需要先确保已经安装pywin32,没有安装可以使用以下命令安装:

    pip install pywin32
    

    以下命令的导包:

    import win32com.client as win32
    import os
    

    下面我们逐个查询API来测试:

    将 Word 文档转换为 PDF

    Document对象有个ExportAsFixedFormat方法:

    https://docs.microsoft.com/zh-cn/office/vba/api/word.document.exportasfixedformat

    所使用到的几个重要参数:

    image-20210723223120699

    下面我们测试一下:

    word_app = win32.gencache.EnsureDispatch('Word.Application')
    file = word_app.Documents.Open(os.path.abspath("成立100周年大会讲话.doc"), ReadOnly=1)
    file.ExportAsFixedFormat(os.path.abspath("成立100周年大会讲话.pdf"),
                             ExportFormat=17, Item=7, CreateBookmarks=1)
    file.Close()
    word_app.Quit()
    

    image-20210724191514022

    可以看到转换成功。

    将 Excel 表格转换为 PDF

    对于Excel主要有两个API:

    https://docs.microsoft.com/zh-cn/office/vba/api/excel.workbook.exportasfixedformat

    https://docs.microsoft.com/zh-cn/office/vba/api/excel.worksheet.exportasfixedformat

    分别针对整个Excel文件和单个工作表。

    我们默认都认为要转换所有工作表,所以只用workbook的导出API。

    第一个参数是XlFixedFormatType 枚举类型,0表示PDF。

    其他参数可以根据实际需要微调。

    测试一下:

    excel_app = win32.gencache.EnsureDispatch('Excel.Application')
    file = excel_app.Workbooks.Open(os.path.abspath("nsheet.xlsx"), ReadOnly=1)
    file.ExportAsFixedFormat(0, os.path.abspath("nsheet.pdf"))
    file.Close()
    excel_app.Quit()
    

    image-20210723224711589

    可以看到每一张工作表都导入到PDF文件的一页中。

    将 PowerPoint 幻灯片转换为 PDF

    对于PPT,官方虽然提供了导出API:Presentation.ExportAsFixedFormat 方法。但经过实测发现会报出The Python instance can not be converted to a COM object的类型错误。

    这是因为PPT的saveAs保存API提供了直接另存为PDF的方法,详见:

    https://docs.microsoft.com/zh-cn/office/vba/api/powerpoint.presentation.saveas

    ppSaveAsPDF常量的值为32,可以在https://docs.microsoft.com/zh-cn/office/vba/api/powerpoint.ppsaveasfiletype中查询到。

    下面测试一下:

    ppt_app = win32.gencache.EnsureDispatch('PowerPoint.Application')
    file = ppt_app.Presentations.Open(os.path.abspath("第1章 机器学习和统计学习.pptx"), ReadOnly=1)
    file.SaveAs(os.path.abspath("第1章 机器学习和统计学习.pdf"), 32)
    file.Close()
    ppt_app.Quit()
    

    image-20210723225937946

    也可以。

    批量转换成PDF

    下面我们将上面测试好的代码封装起来,让其能够对任何一个office三件套之一的文件都能转换PDF,程序员封装为在原文件相对目录下生成相同文件名的PDF文件(可以根据实际需求修改代码):

    office_type = {
        "Word": [".doc", ".docx"],
        "Excel": [".xlsx", ".xls", ".xlsm"],
        "PowerPoint": [".pptx", ".ppt"]
    }
    cache = {}
    for app_name, exts in office_type.items():
        for ext in exts:
            cache[ext] = app_name
    
    
    def office_file2pdf(filename):
        filename_no_ext, ext = os.path.splitext(filename)
        app_name = cache.get(ext)
        if app_name == "Word":
            app = win32.gencache.EnsureDispatch('Word.Application')
            file = app.Documents.Open(os.path.abspath(filename), ReadOnly=1)
            try:
                file.ExportAsFixedFormat(os.path.abspath(f"{filename_no_ext}.pdf"),
                                         ExportFormat=17, Item=7, CreateBookmarks=1)
            finally:
                file.Close()
        elif app_name == "Excel":
            app = win32.gencache.EnsureDispatch('Excel.Application')
            file = app.Workbooks.Open(os.path.abspath(filename), ReadOnly=1)
            try:
                file.ExportAsFixedFormat(
                    0, os.path.abspath(f"{filename_no_ext}.pdf"))
            finally:
                file.Close()
        elif app_name == "PowerPoint":
            app = win32.gencache.EnsureDispatch('PowerPoint.Application')
            file = app.Presentations.Open(os.path.abspath(filename), ReadOnly=1)
            try:
                file.SaveAs(os.path.abspath(f"{filename_no_ext}.pdf"), 32)
            finally:
                file.Close()
    

    开头先定义了各类文件所对应的格式,后面定义了一个同源。

    下面批量转换一下指定文件夹:

    from glob import glob
    
    path = "E:\tmp\test"
    for filename in glob(f"{path}/*"):
        office_file2pdf(filename)
    
    win32.gencache.EnsureDispatch('Word.Application').Quit()
    win32.gencache.EnsureDispatch('Excel.Application').Quit()
    win32.gencache.EnsureDispatch('PowerPoint.Application').Quit()
    

    生成后:

    image-20210723231710551

    PDF书签的提取与写入

    后面我们打算使用PyPDF2来批量加水印,比较尴尬的是用这个库只能重新创建PDF文件,导致书签丢失,所以我们需要事先能提取标签并写入才行。顺便就可以写出一套可以给PDF加书签的方法。

    PyPDF2库的安装:

    pip install PyPDF2
    

    PDF书签提取

    from PyPDF2 import PdfFileReader
    
    
    def get_pdf_Bookmark(filename):
        "作者CSDN:https://blog.csdn.net/as604049322"
        if isinstance(filename, str):
            pdf_reader = PdfFileReader(filename)
        else:
            pdf_reader = filename
        pagecount = pdf_reader.getNumPages()
        # 用保存每个标题id所对应的页码
        idnum2pagenum = {}
        for i in range(pagecount):
            page = pdf_reader.getPage(i)
            idnum2pagenum[page.indirectRef.idnum] = i
    
        # 保存每个标题对应的标签数据,包括层级,标题和页码索引(页码-1)
        bookmark = []
        def get_pdf_Bookmark_inter(outlines, tab=0):
            for outline in outlines:
                if isinstance(outline, list):
                    get_pdf_Bookmark_inter(outline, tab+1)
                else:
                    bookmark.append(
                        (tab, outline['/Title'], idnum2pagenum[outline.page.idnum]))
        outlines = pdf_reader.getOutlines()
        get_pdf_Bookmark_inter(outlines)
        return bookmark
    

    测试提取书签:

    bookmark = get_pdf_Bookmark(filename='mysql.pdf')
    bookmark
    
    [(0, '1. 数据库简介', 0),
     (1, '1.1. 概念', 0),
     (1, '1.2. 数据库分类', 0),
     (2, '1.2.1. 网络数据库', 0),
     (2, '1.2.2. 层级数据库', 0),
     (2, '1.2.3. 关系数据库', 0),
     (1, '1.3. 关系型数据库', 1),
     (2, '1.3.1. 基本概念', 1),
     (2, '1.3.2. 典型关系型数据库', 1),
    ......
    

    PDF书签保存到文件

    def write_bookmark2file(bookmark, filename="bookmark.txt"):
        with open(filename, "w") as f:
            for tab, title, pagenum in bookmark:
                prefix = "\t"*tab
                f.write(f"{prefix}{title}\t{pagenum+1}\n")
    
    
    write_bookmark2file(bookmark)
    

    image-20210723234522223

    从文件读取PDF书签数据

    有时我们希望自定义标签,所以可以从文件读取书签数据:

    def read_bookmark_from_file(filename="bookmark.txt"):
        bookmark = []
        with open(filename) as f:
            for line in f:
                l2 = line.rfind("\t")
                l1 = line.rfind("\t", 0, l2)
                bookmark.append((l1+1, line[l1+1:l2], int(line[l2+1:-1])-1))
        return bookmark
    

    测试:

    read_bookmark_from_file()
    

    读取结果与上面提取到的书签一致。

    向PDF写入书签数据

    下面我们测试从一个PDF读取书签后原本复制并保存。

    先原样复制PDF:

    from PyPDF2 import PdfFileReader, PdfFileWriter
    
    filename = 'mysql.pdf'
    pdf_reader = PdfFileReader(filename)
    pdf_writer = PdfFileWriter()
    for page in pdf_reader.pages:
        pdf_writer.addPage(page)
    

    读取书签并写入:

    bookmark = read_bookmark_from_file()
    
    last_cache = [None]*(max(bookmark, key=lambda x: x[0])[0]+1)
    for tab, title, pagenum in bookmark:
        parent = last_cache[tab-1] if tab > 0 else None
        indirect_id = pdf_writer.addBookmark(title, pagenum, parent=parent)
        last_cache[tab] = indirect_id
    pdf_writer.setPageMode("/UseOutlines")
    

    最后保存看看:

    with open("tmp.pdf", "wb") as out:
            pdf_writer.write(out)
    

    可以看到书签已经完美保留:

    image-20210724001024446

    给PDF加水印

    对于给PDF加水印,我个人还是推荐一些在线的免费工具或WPS。这些工具基本都支持加悬浮的透明水印。除非你确实有批量给PDF文件加水印的需求。

    需要注意使用python的PyPDF2库给PDF加水印,采用的是叠加模式,实际并不能算是加水印,而是加背景。

    具体原理是用一张需要作为水印的PDF打底,然后将原本的PDF文件一页页叠加到上面。

    首先我们需要生成水印PDF:

    生成水印PDF文件

    代码:

    import math
    from PIL import Image, ImageFont, ImageDraw, ImageEnhance, ImageChops
    
    
    def crop_image(im):
        '''裁剪图片边缘空白'''
        bg = Image.new(mode='RGBA', size=im.size)
        bbox = ImageChops.difference(im, bg).getbbox()
        if bbox:
            return im.crop(bbox)
        return im
    
    
    def set_opacity(im, opacity):
        '''设置水印透明度'''
        assert 0 <= opacity <= 1
        alpha = im.split()[3]
        alpha = ImageEnhance.Brightness(alpha).enhance(opacity)
        im.putalpha(alpha)
        return im
    
    
    def get_mark_img(text, color="#8B8B1B", size=30, opacity=0.15):
        width = len(text) * size
        mark = Image.new(mode='RGBA', size=(width, size+20))
        ImageDraw.Draw(im=mark) \
            .text(xy=(0, 0),
                  text=text,
                  fill=color,
                  font=ImageFont.truetype('msyhbd.ttc', size=size))
        mark = crop_image(mark)
        set_opacity(mark, opacity)
        return mark
    
    
    def create_watermark_pdf(text, filename="watermark.pdf", img_size=(840, 1150), color="#8B8B1B", size=30, opacity=0.15, space=75, angle=30):
        mark = get_mark_img(text, color, size, opacity)
        im = Image.new(mode='RGB', size=img_size, color="white")
        w, h = img_size
        c = int(math.sqrt(w**2 + h**2))
        mark2 = Image.new(mode='RGBA', size=(c, c))
        y, idx = 0, 0
        mark_w, mark_h = mark.size
        while y < c:
            x = -int((mark_w + space)*0.5*idx)
            idx = (idx + 1) % 2
            while x < c:
                mark2.paste(mark, (x, y))
                x = x + mark_w + space
            y = y + mark_h + space
        mark2 = mark2.rotate(angle)
        im.paste(mark2, (int((w-c)/2), int((h-c)/2)),  # 坐标
                 mask=mark2.split()[3])
        im.save(filename, "PDF", resolution=100.0, save_all=True)
        
    create_watermark_pdf("小小明的CSDN:https://blog.csdn.net/as604049322")
    

    生成效果:

    image-20210724002351184

    当然我们也可以借助word或WPS生成这样的水印PDF。

    然后就可以批量给每一页加水印了:

    PyPDF2库批量加水印

    import os
    from PyPDF2 import PdfFileReader, PdfFileWriter
    from copy import copy
    
    def pdf_add2watermark(filename, save_filepath, watermark='watermark.pdf'):
        watermark = PdfFileReader(watermark).getPage(0)
        pdf_reader = PdfFileReader(filename)
    
        pdf_writer = PdfFileWriter()
        for page in pdf_reader.pages:
            new_page = copy(watermark)
            new_page.mergePage(page)
            new_page.compressContentStreams()
            pdf_writer.addPage(new_page)
        
        with open(save_filepath, "wb") as out:
            pdf_writer.write(out)
    
    
    filename = 'mysql.pdf'
    save_filepath = 'mysql【带水印】.pdf'
    pdf_add2watermark(filename, save_filepath)
    

    image-20210724003038391

    可以看到水印已经成功的加上,就是缺少目录(书签)。

    拷贝书签

    下面我们将书签从原始文件拷贝到加过水印的PDF文件中:

    from PyPDF2 import PdfFileReader, PdfFileWriter
    
    
    def get_pdf_Bookmark(filename):
        "作者CSDN:https://blog.csdn.net/as604049322"
        if isinstance(filename, str):
            pdf_reader = PdfFileReader(filename)
        else:
            pdf_reader = filename
        pagecount = pdf_reader.getNumPages()
        # 用保存每个标题id所对应的页码
        idnum2pagenum = {}
        for i in range(pagecount):
            page = pdf_reader.getPage(i)
            idnum2pagenum[page.indirectRef.idnum] = i
    
        # 保存每个标题对应的标签数据,包括层级,标题和页码索引(页码-1)
        bookmark = []
    
        def get_pdf_Bookmark_inter(outlines, tab=0):
            for outline in outlines:
                if isinstance(outline, list):
                    get_pdf_Bookmark_inter(outline, tab+1)
                else:
                    bookmark.append((tab, outline['/Title'], idnum2pagenum[outline.page.idnum]))
        outlines = pdf_reader.getOutlines()
        get_pdf_Bookmark_inter(outlines)
        return bookmark
    
    
    def copy_bookmark2pdf(srcfile, destfile):
        "作者CSDN:https://blog.csdn.net/as604049322"
        bookmark = get_pdf_Bookmark(srcfile)
        pdf_reader = PdfFileReader(destfile)
        pdf_writer = PdfFileWriter()
        for page in pdf_reader.pages:
            pdf_writer.addPage(page)
        last_cache = [None]*(max(bookmark, key=lambda x: x[0])[0]+1)
        for tab, title, pagenum in bookmark:
            parent = last_cache[tab-1] if tab > 0 else None
            indirect_id = pdf_writer.addBookmark(title, pagenum, parent=parent)
            last_cache[tab] = indirect_id
        pdf_writer.setPageMode("/UseOutlines")
        with open(destfile, "wb") as out:
            pdf_writer.write(out)
    
    
    copy_bookmark2pdf('mysql.pdf', 'mysql【带水印】.pdf')
    

    image-20210724004409380

    成功实现既有水印又有书签。

    上述代码涉及二次调用,而且涉及重复的磁盘读写操作,我们在一次读写磁盘时就直接把书签加上,现在重新封装一下:

    加水印同时复制书签

    将上述代码重新整理一下,并将递归转换为生成器调用:

    from PyPDF2 import PdfFileReader, PdfFileWriter
    from copy import copy
    
    
    def get_pdf_Bookmark(pdf_file):
        "作者CSDN:https://blog.csdn.net/as604049322"
        if isinstance(pdf_file, str):
            pdf_reader = PdfFileReader(filename)
        else:
            pdf_reader = pdf_file
        pagecount = pdf_reader.getNumPages()
        # 用保存每个标题id所对应的页码
        idnum2pagenum = {}
        for i in range(pagecount):
            page = pdf_reader.getPage(i)
            idnum2pagenum[page.indirectRef.idnum] = i
    
        # 保存每个标题对应的标签数据,包括层级,标题和页码索引(页码-1)
        def get_pdf_Bookmark_inter(outlines, tab=0):
            for outline in outlines:
                if isinstance(outline, list):
                    yield from get_pdf_Bookmark_inter(outline, tab+1)
                else:
                    yield (tab, outline['/Title'], idnum2pagenum[outline.page.idnum])
        outlines = pdf_reader.getOutlines()
        return [_ for _ in get_pdf_Bookmark_inter(outlines)]
    
    
    def write_bookmark2pdf(bookmark, pdf_file):
        "作者CSDN:https://blog.csdn.net/as604049322"
        if isinstance(pdf_file, str):
            pdf_writer = PdfFileWriter()
        else:
            pdf_writer = pdf_file
        last_cache = [None]*(max(bookmark, key=lambda x: x[0])[0]+1)
        for tab, title, pagenum in bookmark:
            parent = last_cache[tab-1] if tab > 0 else None
            indirect_id = pdf_writer.addBookmark(title, pagenum, parent=parent)
            last_cache[tab] = indirect_id
        pdf_writer.setPageMode("/UseOutlines")
        if isinstance(pdf_file, str):
            with open(pdf_file, "wb") as out:
                pdf_writer.write(out)
    
    
    def pdf_add2watermark(filename, save_filepath, watermark='watermark.pdf'):
        watermark = PdfFileReader(watermark).getPage(0)
        pdf_reader = PdfFileReader(filename)
        pdf_writer = PdfFileWriter()
        for page in pdf_reader.pages:
            new_page = copy(watermark)
            new_page.mergePage(page)
            new_page.compressContentStreams()
            pdf_writer.addPage(new_page)
        bookmark = get_pdf_Bookmark(pdf_reader)
        write_bookmark2pdf(bookmark, pdf_writer)
    
        with open(save_filepath, "wb") as out:
            pdf_writer.write(out)
    
    
    filename = 'mysql.pdf'
    save_filepath = 'mysql【带水印】.pdf'
    pdf_add2watermark(filename, save_filepath)
    

    image-20210724093755340

    可以看到经过压缩生成的加水印的PDF比原文件更小。

    PyMuPDF给PDF加文字水印

    前面我们使用PyPDF2库给PDF增加了背景底图性质的图片水印,那有什么方法可以给PDF增加文字型的水印呢?那就是通过PyPDF2库。

    官方文档:https://pymupdf.readthedocs.io/en/latest/index.html

    Github:https://github.com/pymupdf/PyMuPDF

    安装:

    pip install pymupdf
    

    实现代码:

    import fitz
    
    with fitz.open("mysql【带水印】.pdf") as pdf_doc:
        for page in pdf_doc:
            page.insert_text((20, 40), "小小明的CSDN", fontsize=30, color=(1, 0, 0),
                             fontname="china-s", fill_opacity=0.2)
            page.insert_text((20, page.rect.height-20), "https://blog.csdn.net/as604049322",
                             color=(1, 1, 1, 1), fontsize=20, fill_opacity=0.2)
        pdf_doc.save('mysql【带水印】2.pdf')
    

    上述代码给PDF每一页都增加了两个悬浮文字,其中纯链接的文字还有点击跳转的效果:

    image-20210724164059422

    当然上述代码只是一种抛砖引玉的写法,想要增加更复杂的文字水印还需各位读者认真阅读官方文档和PyMuPDF的源码。

    我所参考的文档主要有:

    注意:Page.insert_text有个rotate参数可以对文字进行旋转,但该参数仅支持90度倍数的旋转。

    如果直接给未经PyPDF2库压缩的PDF增加文字水印会导致文件大小增加较大,此时还可以使用PyPDF2库对PDF进行压缩输出:

    PyPDF2库压缩PDF

    def compress_pdf(filename, save_filepath):
        pdf_reader = PdfFileReader(filename)
        pdf_writer = PdfFileWriter()
        for page in pdf_reader.pages:
            page.compressContentStreams()
            pdf_writer.addPage(page)
        bookmark = get_pdf_Bookmark(pdf_reader)
        write_bookmark2pdf(bookmark, pdf_writer)
        with open(save_filepath, "wb") as out:
            pdf_writer.write(out)
    

    结合前面PyPDF2读写书签的代码即可完成PDF的压缩。

    展开全文
  • 在线快速将 PDF 转换为 Excel。Acrobat 中 PDF 导出的文件格式选项在使用 Acrobat 中的“导出 PDF”工具将 PDF 导出为不同的文件格式时,每个文件格式都包含唯一的转换设置。要查看可在 Acrobat 中导出 PDF 的各种...

    9948b7086d8c59eb249f03b3e4fbdaeb.png

    在线将 PDF 快速转换为 Word。

    9256e8e022db18fe7a34fc625f1c16c1.png

    在线快速将 PDF 转换为 Excel。

    Acrobat 中 PDF 导出的文件格式选项

    在使用 Acrobat 中的“导出 PDF”工具将 PDF 导出为不同的文件格式时,每个文件格式都包含唯一的转换设置。要查看可在 Acrobat 中导出 PDF 的各种格式,请参阅“工具”>“导出 PDF”。

    f89a5526e1a621471542f4d17ef94edd.png

    Adobe PDF 选项 (Acrobat Pro)

    您可以使用“PDF 优化器”对话框中的设置,将 PDF 重新保存为优化的 PDF。通过“PDF 优化器”,您可以更改 PDF 版本的兼容性,以便可以使用较低版本的 Acrobat 或 Acrobat Reader 进行查看。如果您改变兼容性设置,新的功能在 PDF 可能无法使用。例如,每个兼容性设置的解释,请参阅 PDF 兼容性级别。

    注意:

    如果要在每次将 PDF 转换为特定格式时都使用相同的设置,请在“首选项”对话框中指定这些设置。在“从 PDF 转换”面板中,从列表中选择一种文件格式,然后单击“编辑设置”。(可随时单击“恢复默认值”按钮以恢复到默认设置。)

    图像转换设置

    JPEG 和 JPEG2000 选项

    注意:

    如果您的 PDF 中包含图像集合,可依次选择“工具”>“导出 PDF”>“图像”>“导出所有图像”,以将这些图像分别导出为 JPEG、PNG 或 TIFF 文件。

    (请注意,可用的选项取决于您是将文档导出为 JPEG 还是 JPEG2000。)

    d7072267b90cc3fe4f344fefc770fbd1.png

    文件设置

    灰度/颜色:指定用于平衡文件大小和图像质量的压缩设置。文件越小,图像质量就越差。

    平铺大小:将正在压缩的图像分解为给定大小的块。(如果图像高度或宽度并非块尺寸的偶数倍,不完整的块将用于边缘。)每个块的图像数据是单独压缩的,并且可以单独解压缩。推荐的是 256 默认值。该选项只能应用于 JPEG2000 格式。

    格式:决定文件显示的方式。仅对 JPEG 格式可用。它提供了以下选项:基线(标准):完全下载后显示图像。本 JPEG 格式对于大多数网页浏览器是可识别的。

    基线(优化):优化图像颜色质量并产生较小的文件大小,但不被所有的 Web 浏览器所支持。

    渐进(3 - 5 次扫描):首先下载低分辨率的图像,随着下载的继续不断改进质量。

    色彩管理

    RGB/CMYK/灰度

    指定要应用的色彩管理类型来输出文件并是否嵌入 ICC 配置文件。

    注意:

    如果在包含 JPEG 和 JPEG 2000 图像的 PDF 上使用“导出到”或“导出所有图像”命令,并将内容导出为 JPEG 或 JPEG 2000 格式,在 Acrobat 中打开时,生成的图像可能看起来不同。如果图像包含的色彩配置文件被包括在页面层,而不是图像数据内部,则可能出现这种情况。在这种情况下,Acrobat 无法将页面层色彩配置文件带入生成的已保存图像。

    转换

    色彩空间/分辨率

    为输出文件指定色彩空间和分辨率。您可以允许 Acrobat 自动决定这些设置。要将文件中的彩色图像转换为灰度,选择“灰度”。

    注意:

    较高的分辨率,如 2400 像素每英寸(ppi),只适用于较小的页面大小(最多至 6.826 英寸或 173.380 毫米)。

    PNG 选项

    PNG 格式特别适合在 Web 上使用的图像。

    befa8e0b768dd1c0297d7ea89166a3f8.png

    文件设置

    交错

    指定文件是否为交错的。“无”创建的图像只有成功下载之后,才能在网络浏览器上显示。“Adam7”创建的图像当全部图像文件下载之后,在浏览器上以低分辨率显示。“Adam7”可使下载时间看起来较短,并能使观众看到下载正在进行;但是,它增加了文件大小。

    滤镜:允许您选择不同的滤镜算法。

    无:不使用滤镜压缩图像。推荐索引色和位图模式图像。

    Sub:优化对水平图案或混合图像所进行的压缩。

    Up:优化垂直图案的压缩。

    Average:通过平均邻近像素的色值来优化低杂色压缩。

    Paeth:通过重新分配邻近像素的颜色值来优化低杂色压缩。

    自适应应用最适合图像的滤镜算法-Sub、Up、Average 或 Paeth。如果您无法确定要使用的滤镜,则请选择“自适应”。

    色彩管理

    RGB/灰度

    为输出文件指定应用的色彩管理类型和是否要嵌入 ICC 配置文件。

    转换

    色彩空间/分辨率

    为输出文件指定色彩空间和分辨率。您可以允许 Acrobat 自动决定这些设置。要将文件中的彩色图像转换为灰度,选择“灰度”。

    注意:

    较高的分辨率,如 2400 ppi,只适用于较小的页面大小(最多至 6.826 英寸或 173.380 毫米)。

    TIFF 选项

    TIFF 是灵活的位图图像格式,几乎被所有的绘图、图像编辑和页面排版应用程序支持。自动决定所采用的分辨率。

    文件设置

    单色

    指定压缩格式。默认值是“CCITT 组 4”,通常生成的文件最小。ZIP 也可生成较小的文件。

    注意:

    某些应用程序无法打开使用 JPEG 或 ZIP 压缩保存的 TIFF 文件。在这些情况下,建议使用 LZW 压缩。

    色彩管理

    RGB/CMYK/灰度/其它

    请指定用于输出文件的色彩管理类型:

    转换

    色彩空间/分辨率

    为输出文件指定色彩空间和分辨率。您可以允许 Acrobat 自动决定这些设置。要将文件中的彩色图像转换为灰度,选择“灰度”。

    注意:

    较高的分辨率,如 2400 ppi,只适用于较小的页面大小(最多至 6.826 英寸或 173.380 毫米)。

    Microsoft Word 和 RTF 选项

    可以将 PDF 导出为 Word 格式(DOCX 或 DOC)或富文本格式 (RTF)。在 Acrobat 中,转到“工具”>“导出 PDF”,然后选择“Microsoft Word”或“Word 97-2003 文档”。单击

    988a82b74504dc7f1a878a5c3024d454.png(设置)图标时,以下选项可用:

    81354002d72f05bf9f1f2dc126322ad4.png

    版面设置

    保留流排文本:指定必须保留文本流。

    保留页面布局:指定必须保留页面布局。

    注释设置

    包含注释:将注释导出到输出文件。

    图像设置

    包含图像:将图像导出到输出文件。

    文本识别设置

    在需要时识别文本:如果 PDF 包含带有文本的图像,则识别文本。

    设置语言:为 OCR 指定语言设置。

    HTML 网页选项

    单击高级设置时,以下选项可用:

    ce28671efef4afdd98a15bbfc9540b1f.png

    文件和导览窗格设置

    单页 HTML

    指定在导出到 HTML 时创建单个 HTML 文件。要添加导览窗格,请启用以下选项:添加基于标题的导览框架

    添加基于书签的导览框架

    多页 HTML

    指定在导出到 HTML 时创建多个 HTML 文件。选择下列条件之一,将文档拆分成多个 HTML 文件。按文档标题拆分

    按文档书签拆分

    内容设置

    包含图像

    指定将 PDF 导出为 HTML 时是否导出图像。

    检测并删除页眉和页脚

    指定是否应当从 HTML 文件中删除 PDF 的页眉和页脚内容。

    文本识别设置

    在需要时识别文本

    如果 PDF 包含的图像中含有文本,识别该文本。

    设置语言

    指定 OCR 的语言设置。

    电子表格选项

    在 Acrobat 中,转到“工具”>“导出 PDF”,然后选择“Microsoft Excel 工作簿”或“XML 电子表格 2003”。单击

    988a82b74504dc7f1a878a5c3024d454.png(设置)图标时,以下选项可用:

    f452bdeb51bd3987556428704e60428d.png

    Excel 工作簿设置

    指定是为每个表格或页面,还是为整个文档创建工作表。

    数字设置

    为数值数据指定十进制和千位分隔符。选择以下选项之一:使用区域设置检测十进制和千位分隔符

    将以下项视为十进制和千位分隔符。在各个域中输入或选择分隔符。

    文本识别设置

    在需要时识别文本

    如果 PDF 包含的图像中含有文本,识别该文本。

    设置语言

    指定 OCR 的语言设置。

    PostScript 或内嵌式 PostScript (EPS) 选项

    您可以将 PDF 导出到 PostScript® 以用于打印和在印前应用程序中使用。PostScript 文件包括完整的 DSC(文档构架惯例)注释和 Adobe Acrobat Distiller® 保留的其它高级信息。您也可以从任何 PDF 创建 EPS 文件以用于放入或在其它应用程序中打开。可用的选项取决于您将文档转换为 PostScript 还是 EPS 格式。

    注意:

    如果您在 Acrobat Pro 中创建 EPS 文件以用于分色,则所有图像的色彩空间都应为 CMYK。

    打印机描述文件

    PostScript 打印机描述 (PPD) 为特定输出设备提供正确设置 PostScript 文件格式所需的信息。“设备无关”仅创建复合的(没有分色)PostScript 或 EPS 文件。“Acrobat 默认值”为创建所有类型的 PostScript 提供一个起始点和参照,并为转换恢复所有默认设置。Adobe PDF 7.0 与大多数设备都兼容。本选项仅用于 PostScript (PS) 格式。

    ASCII 或二进制

    指定图像数据的输出格式。“二进制”输出生成的文件较小,但并非所有的工作流都能适用二进制输出。

    PostScript

    指定 PostScript 兼容性级别。仅当目标输出设备支持时,才使用语言级别 3。语言级别 2 适合于放置在其它文档中且作为该文档一部分分色的 EPS 文件。对于导入到 Microsoft 应用程序中的 EPS 文件,使用语言级别 2。

    字体范围

    指定要在 PostScript 中包含的字体。嵌入字体来自 PDF;引用的字体来自使用中的计算机。

    包含注释

    在生成的 PostScript 文件中保留注释外观。

    将 TrueType 转换为 Type 1

    在生成的 PostScript 文件中将 TrueType 字体转换为 Type 1 字体。

    包含预览

    指定是否为生成的 EPS 文件创建 TIFF 预览。当另存为 PostScript 时,此选项不可用。

    页面范围

    指定您要导出的页面。如果您将文件导出为 EPS 输出,则页面范围内的每一页都将被另存为单个 EPS 文件。

    文本和 XML 选项

    您可以将 PDF 导出为文本和 XML 格式。在 Acrobat 中,转到“工具”>“导出 PDF”>“更多格式”,然后根据需要选择“可用文本”、“纯文本”或“XML 1.0”。

    c2b3000f159da5a0e400a04eb4be8ff2.png

    单击 XML 1.0

    988a82b74504dc7f1a878a5c3024d454.png(设置)图标时,以下选项可用:

    f7248b8e1a74773b6fb724434c50c369.png

    输出文件设置

    编码

    指基于国际标准的二进制值,用于代表文本字符。UTF-8 是每个字符使用一个或多个 8-bit 字节的 Unicode 字符表示方法,UTF-16 是使用 16-bit 字节字符的表示方法。ISO-Latin-1 以 8 位字节代表字符,是 ASCII 的父集。UCS-4 是以 4 个八位组编码的“通用字符集”。HTML/ASCII 是用 ANSI 开发的以 7 位字节代表字符的编码。

    “使用映射表默认”使用映射表中定义的默认字符编码,该信息显示在 Plug-ins/SaveAsXML/MappingTables 文件夹中。这些影射表指定字符的数据输出的方法,包括以下默认的字符编码:UTF-8(另存为 XML 或 HTML 4.0.1)和 HTML/ASCII (另存为 HTML 3.2)。

    生成书签

    生成指向 HTML 或 XML 文档内容的书签。链接被放置在生成的 HTML 或 XML 文档的开始处。

    为无标签文件生成标签

    为尚未加标签的文件(例如,使用 Acrobat 4.0 或更低版本创建的 PDF)生成标签。如果未选定本选项,则不转换未加标签的文件。

    注意:

    标签仅被应用为转换过程的一部分,而且在转换完成之后将被放弃。这不是从旧文件创建加标签的 PDF 的方法

    图像文件设置

    生成图像

    控制转换图像的方法。转换的图像通过 XML 和 HTML 文档引用。

    使用子文件夹

    指定存放生成图像的文件夹。默认值是图像。

    使用前缀

    如果您有同一图像文件的多个版本,请指定添加到图像文件名的前缀。指定给图像的文件名的格式为“filename_img_#”。

    输出格式

    指定图像的最终格式。默认值是 JPG。

    缩减像素采样至

    缩减像素采样图像文件到指定的分辨率。如果您未选定本选项,则图像文件具有与源文件相同的分辨率。图像文件从不增加像素采样。

    展开全文
  • https://github.com/kayalshri/tableExport.jquery.plugin https://github.com/kayalshri/ tableExport.jquery.plugin Export HTML Table to JSON XML PNG CSV ...Ms-Excel Ms-Powerp...
  • pdf书签制作
  • 根据word模板导出word、PDF文档,功能全,内容多,介绍详细。主要实现根据word模板及模板中的坐标($[标明.字段名])的形式进行查询出所对应的数据,然后分别生成PDF 和 WORD功能。 本功能是将各个模板的数据均查询...
  • 使用 Spire.Pdf 生成书签但是有 Evaluation Warning : The document was created with Spire.PDF for .NET.字样 这里用到了两个插件 Spire.Pdf 与 iTextSharp 请在 NuGet 下载安装 由于使用 Spire.Pdf 生成的...
  • Excel VBA方法实现报表自动生成pdf,用Excel VBA方法实现报表自动生成
  • 首先poi需要的jar包全部导入工程 ...然后加入poi导出word的工具类(即插即用) package com.ftx.word; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import j...
  • java生成pdfexcel的方法

    千次阅读 2012-12-15 14:50:36
    这段时间接手一个项目,java生成pdf和word,随便在网上找了点比较好的资料,放在这里,以便学习。 一、前言  在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText...
  • 本方法是针对word导出操作,需要制作好的模板文件 模板.doc 引入应用Microsoft.Office.Interop.Word 11.0 (office2003) 导出文件注意:有时候迅雷会在浏览器中安装插件,下载时会默认使用迅雷下载,导致下载的文档...
  • openoffice2.0输出带多级书签的PDF文档(转) OO在输出PDF文档时会自动将标题 的章节结构输出成PDF书签。 具体操作: 选择作为书签的文本 -> 把“段落样式”改成“标题1” 这样被选择的文本...
  • 最开始采用了npoi导出word,npoi采用的是遍历整个word文档中的段落,然后读取标签,然后再将该标签进行替换的模式。但是存在两个问题:1、替换的字符串中加上换行符\n,不起作用,就是在替换的字符串是不能换行的...
  • PDF所有目录的页码全部变为“错误!未定义书签!...,该问题的大部分答案都在说“域”的问题,解决方法是按着ctrl+F11,但还是没有什么用,于是我就用了word的导出,一看有PDF格式, 用了真香 ...
  • 1.把word文档转换成pdf (1).添加引用 1 using Microsoft.Office.Interop.Word; 添加引用 (2).转换方法 1 /// <summary> 2 /// 把Word文件转换成pdf文件 3 /// </summary> 4 /// &...
  • 日常工作中,我们经常需要将 office 三件套,Word、Excel和PPT转换成PDF。当然办公软件自身都带有这样的功能,但当我们需要一次性转换大量的office文件时,还是用程序批量处理比较方便。 其实这类代码有其他作者写过...
  • 《C#开发实例大全(基础卷)》筛选、汇集了C#开发从基础知识高级应用各个层面约600个实例及源代码,每个实例都按实例说明、关键技术、设计过程、详尽注释、秘笈心法的顺序进行了分析解读。全书分6篇共25章,主要...
  • 当前,对报表工具来说,支持导出基本算是标配功能,除了开源报表工具在支持的文件类型上有限制外,对于商业报表工具来说,常用的文件类型,几乎没什么区别,比如都支持导出 word、excelpdf、txt 等。 至于使用的...
  • Excel催化剂在2018年开始,陆续写出了230+篇高质量原创性文章,将Excel催化剂插件的开发过程及使用方法全方位地通过文字的方式给广大网友们分享了。电子书下载方式...
  • 文章目录前言全局设置效果类修改字体、颜色、字体大小、行高等文字居中(靠右)对齐图片转存至相对路径图片缩放图片居中内容类Excel的表格与Markdown表格的互转`mermaid`相关使用特殊文字使用`classDef`语法来自定义`...
  • -导出PDF页面或者整个文件任意一种支持的图形格式,包括BMP,JPEG,TIFF,PNG等等等等… -从PDF页面/文件里提取文本面 -易于导航,让你浏览大型或者复制的PDF文件变得简单而有乐趣——通过我们的扩展功能:放大镜...
  • Aspose 产品支持一些商业上最流行的文件格式,包括:Word 文档、Excel 电子表格、PowerPoint 演示文稿、PDF 文档、Flash 演示文稿和项目文件。 二、下载 下载 Aspose 的依赖 Jar 包可以通过一下仓库下载:Aspo
  • PDF Reader Pro v2.7.7

    2021-04-28 17:12:39
    PDF Reader Pro 提供更多功能 – 直接编辑PDF本文文字、合并多个文档、将PDF拆分为多个文件、从另一个PDF文件插入页面、插入图片注释、页眉页脚、链接、手绘、导出注释、打印、本地离线PDF转Word / Excel / PPT等...
  • 但其导出PDF文档没有书签。在Office 2007 SP2中,微软加入了该功能,对应的接口是ExportAsFixedFormat。该方法不仅适用于Word,而且也适用于Excel。 一个简单的Python脚本来展示如何转换DOC为PDF。该脚本需要Of
  • 在开发过程中,会遇到在命令行下将DOC文档(或者是其他Office文档)转换为PDF的要求。比如在项目中如果手册是DOC格式的,在项目发布时希望将其转换为PDF格式,...但其导出PDF文档没有书签。在Office 2007 SP2中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 660
精华内容 264
关键字:

导出pdf书签到excel