当前位置: 首页 > 知识库问答 >
问题:

从pdf获取批注以添加到其他文档

宦琪
2023-03-14

我用的是iTextSharp版。

对于我的项目,我需要使用pdfWriter将我的pdf文档复制到另一个pdf文档中。我不能使用pdfCopy或pdfStamper。

因此,在此操作期间,所有注释都会丢失。

首先,我开始寻找如何获得“铅笔注释绘图标记”的注释,如下图所示:

我找到了如何获取注释字典:

Dim pdfReader As New PdfReader(pdfPath)
Dim page As PdfDictionary = pdfReader.GetPageN(0)
Dim annots As PdfArray = page.GetAsArray(PdfName.ANNOTS)
If annots IsNot Nothing Then
    For i = 0 To annots.Size - 1
        Dim annotDict As PdfDictionary = annots.GetAsDict(i)
        Dim annotContents As PdfString = annotDict.GetAsString(PdfName.CONTENT)
        Dim annotSubtype As PdfString = annotDict.GetAsString(PdfName.SUBTYPE)
        Dim annotName As PdfString = annotDict.GetAsString(PdfName.T)

    Next
End If

当循环解析我的注释时,annotName变量返回我的名字,所以我确定要解析我要查找的注释,但annotSubtype等于Nothing,这怎么可能?根据第12.5.2节表1666中的pdf规范(https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf),subype参数是必需的,所以这不是意味着它不应该是空的吗?

此外,如何获取与此注释相关的图像?我以为它会存储在注释字典的内容中,但在上面的代码中也没有返回任何内容。。。

关于为什么我不能首先使用pdf时间戳:我的pdf文档的一个页面必须调整大小(缩小)才能在页面底部添加一些文本,所以我必须使用pdfWriter。

问:如何使用 iTextSharp 5.0 获取注释注释的绘制线?

共有1个答案

马晓博
2023-03-14

你的帖子里有很多单一的问题…

当循环解析我的注释时,< code > annotename 变量返回我的名字,所以我确定解析了我正在寻找的注释,但是< code > annotype 等于< code>Nothing,这怎么可能呢?

根据第12.5.2节表1666中的pdf规范(https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf),subype参数是必需的,所以这不是意味着它不应该是空的吗?

根据ISO 32000-1第12.5.2节中的表164,子类型条目确实是必需的,但是当您尝试检索字符串时,它还被指定为名称:

Dim annotSubtype As PdfString = annotDict.GetAsString(PdfName.SUBTYPE)

由于PDF中该注释的子类型条目是一个名称,因此< code>GetAsString返回< code>Nothing。

因此,请改为调用“获取名称”,并期望使用“文件名称”返回类型。

此外,如何获取与此注释相关的图像?我以为它会存储在注释字典的内容中,但在上面的代码中也没有返回任何内容。。。

在上面的同一个表中,Contents条目被指定为可选的,并且(如果存在)具有一个文本字符串值,其中包含一个应为注释显示的文本,或者,如果这种类型的注释不显示文本,则为注释内容的人类可读形式的替代描述。由于注释只是一个涂鸦,注释的内容值应该是什么?

由于您的批注实际上是 Ink 批注,因此您可以在所需的 InkList 和批注的可选 BS 条目中找到涂鸦的表示形式,请参阅 ISO 32000-1 第 12.5.6.13 节的表 182。

InkList 的值是一个由 n 个数组组成的数组,每个数组表示一个描边路径。每个数组应是默认用户空间中的一系列交替的水平和垂直坐标,指定沿路径的点。绘制时,点应以依赖于实现的方式通过直线或曲线连接。

BS的值(如果存在)是边框样式字典(参见表166),指定绘制路径时应使用的线宽和破折号模式。

但是要注意:注释字典的AP条目(如果存在)优先于InkList和BS条目。在您的PDF中,注释有一个外观条目。因此,实际显示的内容是正常外观流,其中包含绘制涂鸦的矢量图形指令。

关于为什么我不能首先使用pdf时间戳:我的pdf文档的一个页面必须调整大小(缩小)才能在页面底部添加一些文本,所以我必须使用pdfWriter。

首先,这只意味着您必须对该特殊页面做一些特殊的事情,没有必要通过使用PdfWriter复制所有页面来损坏所有页面。您可以在单独的文档中操作该单页,然后使用PdfCopy从原始PDF复制该页之前的页面,然后从单独的PDF复制该页,然后从原始PDF复制该页之后的所有页面。

因此,您只需修复该特殊页面的注释,其他页面上的注释可以保持不变。

此外,如果您准备使用低级iText例程,您甚至可以使用< code>PdfStamper。特别是在戳记之前,您可以将静态的< code>PdfReader方法< code>GetPageContent应用于特殊页面的页面字典,以字节数组的形式检索页面内容,从中构建一个新的字节数组,在该数组中预先考虑一个执行缩减的仿射变换,并使用底层< code>PdfReader的< code>SetPageContent方法将新的字节数组设置为相关页面的内容

但是,即使在这种情况下,您也必须调整注释坐标(矩形和其他坐标,如您的InkList)。。。

问:如何使用 iTextSharp 5.0 获取注释注释的绘制线?

如上所述,scrible的注释是一个Ink注释,绘制的路径在其字典的InkList和BS条目中指定,并在其正常外观流中额外实例化。

 类似资料:
  • 我如何通过我自己的API从另一个API获取PDF,然后到前面供用户下载。 我现在得到的只是一张空白页。 后面是Scala的,当我打印文件时,我得到一个字符串。

  • 问题内容: 如何控制转盘中包含哪些文件?似乎没有被使用。 更新 : 我错了从源tarball安装与安装轮子之间的区别。源代码发行版包含中指定的文件,但已安装的软件包仅包含python文件。无论是通过源分发版,egg还是wheel安装,都需要采取步骤来确定应安装的其他文件。即,其他软件包文件需要package_data,而软件包外部文件(例如命令行脚本或系统配置文件)需要data_files。 原始

  • 我考虑了两种解决方法: 通过php exec使用GhostScript读取上传的文件并获取其尺寸-我还不能让这种方法起作用 使用PHP PDF库读取上传的文件并获取其尺寸(如fdpi/fpdf)-我有一些东西在工作(我想!) 至于Ghostscript,我在这里找到了这个答案,因此建议使用另一个名为(我确实是按照评论建议先下载的)。然而,我无法让它正常工作。在将其添加到任何PHP脚本之前,我尝试运

  • 问题内容: 我有两个实体,消息和用户。用户与消息有一个ManyToMany关系(一个用户可以有多个消息),而消息(现在,为了使其不那么复杂)与用户有一个ManyToMany关系(可以将一条消息发送给多个用户)。 我正在使用@JoinTable加入这两个实体,但是,我想在连接表中添加一个“状态”列,以告知该消息是否是新消息,已读消息等。我当时正在考虑将该列放入Message实体中,但是,我认为这可能

  • 我有非常具体的任务在Delphi2010与PDF。经过几天的斗争,我想请求你的帮助。 任务: 在表单上的嵌入式查看器组件中打开pdf 在文档上用鼠标定义矩形 从图像文件(BMP或PNG或JPG)中添加矩形标记注释。必须将图像拉伸到选定的区域。 null Acrobat可以显示PDF和注释,但有一种方法可以从图像文件中选择矩形和添加标记。 gnostice可以显示PDF,可以选择矩形但不能从图像文件