首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在合并的文档中插入PieceInfo和ITextSharp

在合并的文档中插入PieceInfo和ITextSharp
EN

Stack Overflow用户
提问于 2016-01-05 09:37:59
回答 1查看 1K关注 0票数 1

我有一个将几个PDF合并到一个PDF中的过程。效果很好。

在合并时,我希望在页面级别添加一个PieceInfo,以跟踪包含到该合并文件中的文档。

假设我按这个顺序有3个文档: Fester.pdf (2页)、Gomez.pdf (2页)和Lurch.pdf (1页)。合并之后,我将有5个页面,每个页面都有一个文件名为PieceInfo,该文件名来自。这样,如果我转到第4页,我就会知道该页面是从Gomez.pdf生成的。

在搜索过程中,我发现了这篇文章:使用iText库在pdf中插入隐藏摘要和我试图在我的过程中实现相同的内容。这个建议很好,但我不知道如何存储每页的信息。

这是我的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static byte[] MergeDocuments(DocumentCollection myCollection)
{
    PdfImportedPage importedPage = null;

    // Merged the document streams
    using (MemoryStream stream = new MemoryStream())
    {
        // Create the iTextSharp document
        iTextSharp.text.Document pdfDoc = new iTextSharp.text.Document();

        // Create the PDF writer that listened to the document
        PdfCopy pdfCopy = new PdfCopy(pdfDoc, stream);
        if (pdfDoc != null && pdfCopy != null)
        {
            // Open the document and load content
            pdfDoc.Open();

            //Dictionary Entries
            PdfName appName = new PdfName("MyKey");
            PdfName dataName = new PdfName("Hash");

            //Class to add and retrieve the PieceInfo data
            DocumentPieceInfo dpi = new DocumentPieceInfo();

            //Loop through my collection. The document class has the BinaryFile and FileName
            foreach (Document doc in myCollection)
            {
                PdfReader reader = new PdfReader(doc.FileBinary);
                if (reader != null)
                {
                    int nPage = reader.NumberOfPages;
                    for (int n = 0; n < nPage; n++)
                    {
                        //Trying to add the PieceInfo
                        dpi.addPieceInfo(pdfCopy, appName, dataName, new PdfString(string.Format("Info Doc: {0}", doc.FileName)));
                        importedPage = pdfCopy.GetImportedPage(reader, n + 1);
                        pdfCopy.AddPage(importedPage);
                    }
                    // Close the reader
                    reader.Close();
                }
            }

            if (pdfCopy != null)
                pdfCopy.Close();

            if (pdfDoc != null)
                pdfDoc.Close();

            byte[] arrOutput = stream.ToArray();
            return arrOutput;

        }
    }
    return null;
}

以及对MKL解决方案的小改动,将输入更改为PDFCopy:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void addPieceInfo(PdfCopy reader, PdfName app, PdfName name, PdfObject value)
    {
        //PdfDictionary catalog = reader.getCatalog();
        PdfDictionary pieceInfo = reader.ExtraCatalog.GetAsDict(PIECE_INFO);
        if (pieceInfo == null)
        {
            pieceInfo = new PdfDictionary();
            reader.ExtraCatalog.Put(PIECE_INFO, pieceInfo);
        }

        PdfDictionary appData = pieceInfo.GetAsDict(app);
        if (appData == null)
        {
            appData = new PdfDictionary();
            pieceInfo.Put(app, appData);
        }

        PdfDictionary privateData = appData.GetAsDict(PRIVATE);
        if (privateData == null)
        {
            privateData = new PdfDictionary();
            appData.Put(PRIVATE, privateData);
        }

        appData.Put(LAST_MODIFIED, new PdfDate());
        privateData.Put(name, value);
    }

上面的代码仅在最后一页中添加计件信息:(

页面PdfImportedPage对象有获得目录的方法吗?

如何在合并过程中包括每个页面级别的信息?在此之后,我如何从页面中获得pieceInfo?只是在书页上转圈?

EN

回答 1

Stack Overflow用户

发布于 2016-01-06 01:42:07

请注意,/PieceInfo将在ISO-32000-2 (又名PDF2.0)中被废弃.作为另一种选择,您可以创建自己的键来添加自己的自定义数据。我在对如何检查pdf页面中是否存在巨型字符串问题的回答中解释了这一点。

您是在问页面PdfImportedPage对象有获得目录的方法吗?

这不是应该问的问题。如果您很好地学习我的回答,您会发现您需要访问页面字典。您可以将/PieceInfo条目(或自定义条目)添加到此页面字典中,然后再检索它。

看一看CustomPageDictKeyMerge

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void createPdf(String filename) throws IOException, DocumentException {
    PdfName marker = new PdfName("ITXT_PageMarker");
    List<PdfReader> readers = new ArrayList<PdfReader>();
    readers.add(new PdfReader(SRC1));
    readers.add(new PdfReader(SRC2));
    readers.add(new PdfReader(SRC3));
    Document document = new Document();
    PdfCopy copy = new PdfCopy(document, new FileOutputStream(filename));
    document.open();
    int counter = 0;
    int n;
    PdfImportedPage importedPage;
    PdfDictionary pageDict;
    for (PdfReader reader : readers) {
        counter++;
        n = reader.getNumberOfPages();
        for (int p = 1; p <= n; p++) {
            pageDict = reader.getPageN(p);
            pageDict.put(marker, new PdfString(String.format("Page %s of document %s", p, counter)));
            importedPage = copy.getImportedPage(reader, p);
            copy.addPage(importedPage);
        }
    }
    // close the document
    document.close();
    for (PdfReader reader : readers) {
        reader.close();
    }
}

在本例中,我们在导入页面之前向页面字典添加了一个特殊的标记。因此,这个标记将被添加到合并的文档中:

查看CustomPageDictKeyCreate示例,了解如何检索这些自定义标记:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void check(String filename) throws IOException {
    PdfReader reader = new PdfReader(filename);
    PdfDictionary pagedict;
    for (int i = 1; i < reader.getNumberOfPages(); i++) {
        pagedict = reader.getPageN(i);
        System.out.println(pagedict.get(new PdfName("ITXT_PageMarker")));
    }
    reader.close();
}

请确保您的自定义密钥使用了第二个类名。iText已经为它的自定义二等键注册了ITXT前缀。这个前缀确保不同的公司不会为不同的目的使用相同的密钥。所有以ITXT开头的键都可以很容易地识别为iText组创建的密钥。ISO跟踪所有这些前缀以避免重复。在ISO中注册前缀是免费的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34617914

复制
相关文章
十三、表连接
表连接(JOIN)是在多个表中间通过一定的连接条件,使表之间发生关联进而能从多个表之间获取数据。简单的表连接语法如下:
喵叔
2021/06/25
8570
十三、表连接
Oracle表连接
  内连接:查询满足条件的结果集,是相对于外连接来说的(条件的话由很多种可以等于、不等于、大于、小于等等)。
翎野君
2023/05/12
7310
如何使用python连接MySQL表的列值?
MySQL 是一个开源关系数据库管理系统,广泛用于存储、管理和组织数据。使用 MySQL 表时,通常需要将多个列值组合成一个字符串以进行报告和分析。Python是一种高级编程语言,提供了多个库,可以连接到MySQL数据库和执行SQL查询。
很酷的站长
2023/08/11
3080
如何使用python连接MySQL表的列值?
面试之前,MySQL表连接必须过关!——表连接的原理
我们知道,所谓表连接就是把各个表中的记录都取出来进行依次匹配,最后把匹配组合的记录一起发送给客户端。比如下面把t1表和t2表连接起来的过程如下图
砖业洋__
2023/05/06
2K0
面试之前,MySQL表连接必须过关!——表连接的原理
连表查询的介绍_连接表
大家好,又见面了,我是你们的朋友全栈君。 1、连表查询的原因 (1)如果查询结果不在一个表中,在多个表中,那就需要将表关联,进行连表查询。 (2)连表查询大多数都作用在外键得基础上。—表与表之间有关
全栈程序员站长
2022/10/05
3.1K0
连表查询的介绍_连接表
MySQL之表连接
当需要同时显示多个表的字段时,就可以用表连接来实现这样的功能。从大类上分,表连接可分为内连接和外连接,它们之间的最主要区别是,内连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录。
秋白
2019/02/21
2K0
MySQL之表连接
【MySql】表的内连接和外连接
内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。
平凡的人1
2023/10/15
2960
【MySql】表的内连接和外连接
简单备份wordpress连接表
用过 wordpress 的朋友都知道,WordPress 可以导出 WordPress eXtended RSS 或 WXR 文件,它包含了您的全部文章、页面、评论、自定义域、分类目录和标签。我们可以在再次安装 WordPress 时导入它。那么WordPress 的链接表怎么备份呢?
空空裤兜
2023/03/03
6870
MySQL表的内外连接
内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。而使用where进行笛卡尔积筛选的时候,后面必须跟着一个过滤条件,将不合理的数据筛选掉,并且这时候再跟着其他条件就需要and其他条件,所以这种方式的内连接虽然可以,但是容易将内连接的条件与其他约束条件混淆,不容易区分。
每天都要进步呀
2023/10/16
2160
MySQL表的内外连接
SQL三表连接查询
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/135565.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/18
2.1K0
MySQL | 表的内连接
数据操作语言:表连接查询(一) 从多张表中提取数据 从多张表提取数据,必须指定关联的条件。如果不定义关联条件就会出现无条件连接,两张表的数据会交叉连接,产生 笛卡尔积。 规定了连接条件的表连接语句,就不会出现笛卡尔积。 # 查询每名员工的部门信息 SELECT e.empno,e.ename,d.dname FROM t_emp e JOIN t_dept d ON e.deptno=d.deptno; 表连接的分类 表连接分为两种:内连接 和 外连接 内连接是结果集中只保留符合连接条件的记录 外
Zkeq
2022/05/18
3.4K0
MySQL | 表的内连接
关于哈希表,你该了解这些!
首先什么是 哈希表,哈希表(英文名字为Hash table,国内也有一些算法书籍翻译为散列表,大家看到这两个名称知道都是指hash table就可以了)。
代码随想录
2020/07/13
5830
学习日志——SQL几种表连接和连接效率
最近在进行一个数据展示的项目,问题是公司目前的情况是采集到了数据,将数据存入到了一个数据中心,然后就没有任何操作了。也就是说要从原始数据当中查询数据进行数据展示,这是一个很难受的过程,但是又是一个要必然经历的过程,因为原始数据来了之后,必然要通过实际的业务来检验数据的正确性,有效性和质量,然后就对应的业务数据进行清洗,提取存入业务库,方便以后的操作。然后后端代码基本上没怎么写,全部都思考查询sql应该怎么写了。
海加尔金鹰
2020/06/09
2.2K0
Oracle数据库 表连接与表设计
select deptno,e.ename,d.dname from emp e natural join dept d;
wolf
2020/09/21
2.2K0
Oracle表连接学习笔记
内连接:指表连接的结果只包含那些完全满足连接条件的记录。下面学习一下内连接的,给个例子,这里创建两张表,然后用内连接方式查询,看看例子:
SmileNicky
2019/06/25
9200
如何制作bom表_如何制作bom表
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/175678.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
3K0
树状数据库表查询2次以上(自连接、内连接、别名、邻接表)方法
https://www.cnblogs.com/kissdodog/p/3297894.html——这个讲清楚了。
hotqin888
2022/05/07
4530
执行计划之表连接1:连接树(Join Trees)
阅读官方在线文档无疑是学习Oracle最好的方法,本文参考在线文档介绍表连接以及连接树(Join Trees)。
SQLplusDB
2022/08/19
6550
执行计划之表连接1:连接树(Join Trees)
SAS中哈希表的连接问题
哈希表即散列表(Hash table),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。在SAS中使用哈希表十分简单,你并不需要知道SAS内部是怎么实现的,只需要知道哈希表是存储在内存中的,查找是根据key值直接获得存储的地址的精确匹配。加上使用哈希表合并数据集时不用排序的优点,在实际应用中可以极大的提高程序运行效率,尤其是数据集较大的时候。但是由于哈希表是放到内存中的,因此对内存有一定要求!
专业余码农
2020/07/15
2.4K0
点击加载更多

相似问题

当键是数字时,python字典

10

混合字典排序和数字排序

11

当数字的数字分开时对它们进行排序

10

当数字被重复时,数据读取

21

仅当没有重复的数字时才打印数字

60
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文