- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下问题。我有一个 PDF,其中附有一个 XML 文件作为注释。不是作为嵌入文件而是作为注释。现在我尝试使用以下链接中的代码阅读它:
iTextSharp - how to open/read/extract a file attachment?
它适用于嵌入文件,但不适用于作为注释的文件附件。
我谷歌了一下从PDF中提取注释,找到了以下链接: Reading PDF Annotations with iText
所以注解类型是“File Attachment Annotations”
有人可以展示一个工作示例吗?
在此先感谢您的帮助
最佳答案
在有关 iText 和 iTextSharp 的问题中,人们应该首先查看 keyword list on itextpdf.com。 .在这里你可以找到 File attachment, extract attachments引用来自 iText in Action — 2nd Edition 的两个 Java 示例:
旧的关键字列表不再存在; itextpdf.com 站点现在提供了其他搜索示例的方法,但我不会描述它们,以免站点再次更改并且我再次有无效链接...
基于iText in Action — Second Edition的相关iText例子是:
(我还没有找到 .Net 和 iText 7 的示例端口,但根据其他来源,这个端口应该不会太难......)
KubrickDvds 包含以下方法 extractAttachments
/ExtractAttachments
来提取文件附件注释:
Java,iText 5.x:
/**
* Extracts attachments from an existing PDF.
* @param src the path to the existing PDF
*/
public void extractAttachments(String src) throws IOException {
PdfReader reader = new PdfReader(src);
PdfArray array;
PdfDictionary annot;
PdfDictionary fs;
PdfDictionary refs;
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
array = reader.getPageN(i).getAsArray(PdfName.ANNOTS);
if (array == null) continue;
for (int j = 0; j < array.size(); j++) {
annot = array.getAsDict(j);
if (PdfName.FILEATTACHMENT.equals(annot.getAsName(PdfName.SUBTYPE))) {
fs = annot.getAsDict(PdfName.FS);
refs = fs.getAsDict(PdfName.EF);
for (PdfName name : refs.getKeys()) {
FileOutputStream fos
= new FileOutputStream(String.format(PATH, fs.getAsString(name).toString()));
fos.write(PdfReader.getStreamBytes((PRStream)refs.getAsStream(name)));
fos.flush();
fos.close();
}
}
}
}
reader.close();
}
Java,iText 7.x:
public void extractAttachments(String src) throws IOException {
PdfDocument pdfDoc = new PdfDocument(new PdfReader(src));
PdfReader reader = new PdfReader(src);
PdfArray array;
PdfDictionary annot;
PdfDictionary fs;
PdfDictionary refs;
for (int i = 1; i <= pdfDoc.getNumberOfPages(); i++) {
array = pdfDoc.getPage(i).getPdfObject().getAsArray(PdfName.Annots);
if (array == null) continue;
for (int j = 0; j < array.size(); j++) {
annot = array.getAsDictionary(j);
if (PdfName.FileAttachment.equals(annot.getAsName(PdfName.Subtype))) {
fs = annot.getAsDictionary(PdfName.FS);
refs = fs.getAsDictionary(PdfName.EF);
for (PdfName name : refs.keySet()) {
FileOutputStream fos
= new FileOutputStream(String.format(PATH, fs.getAsString(name).toString()));
fos.write(refs.getAsStream(name).getBytes());
fos.flush();
fos.close();
}
}
}
}
reader.close();
}
C#、iText 5.x:
/**
* Extracts attachments from an existing PDF.
* @param src the path to the existing PDF
* @param zip the ZipFile object to add the extracted images
*/
public void ExtractAttachments(byte[] src, ZipFile zip) {
PdfReader reader = new PdfReader(src);
for (int i = 1; i <= reader.NumberOfPages; i++) {
PdfArray array = reader.GetPageN(i).GetAsArray(PdfName.ANNOTS);
if (array == null) continue;
for (int j = 0; j < array.Size; j++) {
PdfDictionary annot = array.GetAsDict(j);
if (PdfName.FILEATTACHMENT.Equals(
annot.GetAsName(PdfName.SUBTYPE)))
{
PdfDictionary fs = annot.GetAsDict(PdfName.FS);
PdfDictionary refs = fs.GetAsDict(PdfName.EF);
foreach (PdfName name in refs.Keys) {
zip.AddEntry(
fs.GetAsString(name).ToString(),
PdfReader.GetStreamBytes((PRStream)refs.GetAsStream(name))
);
}
}
}
}
}
KubrickDocumentary 包含以下方法 extractDocLevelAttachments
/ExtractDocLevelAttachments
来提取文档级附件:
Java,iText 5.x:
/**
* Extracts document level attachments
* @param filename a file from which document level attachments will be extracted
* @throws IOException
*/
public void extractDocLevelAttachments(String filename) throws IOException {
PdfReader reader = new PdfReader(filename);
PdfDictionary root = reader.getCatalog();
PdfDictionary documentnames = root.getAsDict(PdfName.NAMES);
PdfDictionary embeddedfiles = documentnames.getAsDict(PdfName.EMBEDDEDFILES);
PdfArray filespecs = embeddedfiles.getAsArray(PdfName.NAMES);
PdfDictionary filespec;
PdfDictionary refs;
FileOutputStream fos;
PRStream stream;
for (int i = 0; i < filespecs.size(); ) {
filespecs.getAsString(i++);
filespec = filespecs.getAsDict(i++);
refs = filespec.getAsDict(PdfName.EF);
for (PdfName key : refs.getKeys()) {
fos = new FileOutputStream(String.format(PATH, filespec.getAsString(key).toString()));
stream = (PRStream) PdfReader.getPdfObject(refs.getAsIndirectObject(key));
fos.write(PdfReader.getStreamBytes(stream));
fos.flush();
fos.close();
}
}
reader.close();
}
Java,iText 7.x
public void extractDocLevelAttachments(String src) throws IOException {
PdfDocument pdfDoc = new PdfDocument(new PdfReader(src));
PdfDictionary root = pdfDoc.getCatalog().getPdfObject();
PdfDictionary documentnames = root.getAsDictionary(PdfName.Names);
PdfDictionary embeddedfiles = documentnames.getAsDictionary(PdfName.EmbeddedFiles);
PdfArray filespecs = embeddedfiles.getAsArray(PdfName.Names);
PdfDictionary filespec;
PdfDictionary refs;
FileOutputStream fos;
PdfStream stream;
for (int i = 0; i < filespecs.size(); ) {
filespecs.getAsString(i++);
filespec = filespecs.getAsDictionary(i++);
refs = filespec.getAsDictionary(PdfName.EF);
for (PdfName key : refs.keySet()) {
fos = new FileOutputStream(String.format(PATH, filespec.getAsString(key).toString()));
stream = refs.getAsStream(key);
fos.write(stream.getBytes());
fos.flush();
fos.close();
}
}
pdfDoc.close();
}
C#、iText 5.x:
/**
* Extracts document level attachments
* @param PDF from which document level attachments will be extracted
* @param zip the ZipFile object to add the extracted images
*/
public void ExtractDocLevelAttachments(byte[] pdf, ZipFile zip) {
PdfReader reader = new PdfReader(pdf);
PdfDictionary root = reader.Catalog;
PdfDictionary documentnames = root.GetAsDict(PdfName.NAMES);
PdfDictionary embeddedfiles =
documentnames.GetAsDict(PdfName.EMBEDDEDFILES);
PdfArray filespecs = embeddedfiles.GetAsArray(PdfName.NAMES);
for (int i = 0; i < filespecs.Size; ) {
filespecs.GetAsString(i++);
PdfDictionary filespec = filespecs.GetAsDict(i++);
PdfDictionary refs = filespec.GetAsDict(PdfName.EF);
foreach (PdfName key in refs.Keys) {
PRStream stream = (PRStream) PdfReader.GetPdfObject(
refs.GetAsIndirectObject(key)
);
zip.AddEntry(
filespec.GetAsString(key).ToString(),
PdfReader.GetStreamBytes(stream)
);
}
}
}
(出于某种原因,C# 示例将提取的文件放入某个 ZIP 文件中,而 Java 版本将它们放入文件系统中……哦,好吧……)
关于c# - 使用 iTextSharp 阅读 PDF 文件附件注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14947829/
我正在尝试读取一个大型日志文件,该文件已使用不同的分隔符(遗留更改)进行了解析。 此代码有效 import os, subprocess, time, re import pandas as pd f
我试图理解在 Linux 下以 Turbo 模式(特别是 fpc -Mtp -vw)编译的 Free Pascal 中看到的有点神奇的行为。代码来自 Jack Crenshaw 的“让我们构建一个编译
我有一个具有以下结构的 txt 文件: NAME DATA1 DATA2 a 10 1,2,3 b 6 8,9 c 2
我试图理解在 Linux 下以 Turbo 模式(特别是 fpc -Mtp -vw)编译的 Free Pascal 中看到的有点神奇的行为。代码来自 Jack Crenshaw 的“让我们构建一个编译
public class Bug1 { private String s; public void Bug1(){ s = "hello"; } public Stri
我们有这样一种情况,我们的应用程序需要处理一系列文件,而不是同步执行此功能,我们希望采用多线程将工作负载分配给不同的线程。 每一项工作是: 1.以只读方式打开文件 2.处理文件中的数据 3.将处理后的
我正在尝试读取 .php 文件并替换十六进制字符。php文件格式如下: 问题是它弄乱了转义字符 (\") 到目前为止我的代码: while(i=48 && str[i+2]=97 && str[i+
我正在用 C# 开发一个程序,我需要一些帮助。我正在尝试创建一个数组或项目列表,显示在某个网站上。我想要做的是阅读 anchor 文本,它是 href。例如,这是 HTML:
我有一个偏好设置,它控制我的应用程序是否在用户单击按钮时播放声音(这种情况经常发生,想想计算器)。每次用户单击按钮时,都会调用以下方法: private void playButtonClickSou
我正在尝试在我的标签末尾创建一个阅读更多按钮。我希望它默认显示 3 行。我正在用 swift 而不是 objective c 编写代码。只有当用户点击标签的阅读更多部分时,标签才会展开。它的外观和工作
当您获得第三方库(c、c++)、开源(LGPL 说)但没有很好的文档时,了解它以便能够集成到您的应用程序中的最佳方法是什么? 该库通常有一些示例程序,我最终使用 gdb 浏览了代码。还有其他建议/最佳
同时从 2 个或更多不同线程对同一个文件描述符使用 pread 是否有问题? 最佳答案 pread 本身是线程安全的,因为它不在 list of unsafe functions 上.所以调用它是安全
当您使用命令 pd.read_csv 读取 csv 时,如何跳过连续包含特定值的行?如果在第 50、55 行,第一列的值为 100,那么我想在读取 csv 文件时跳过这些行。我如何将这些命令放入像 p
我迫切需要在 C# 中使用 T4 生成 HTML 输出。 我正在使用 Runtime-T4-Files 并选择“TextTemplatingFilePreprocessor”而不是“TextTempl
今年夏天我在实习期间一直在学习 ERP 应用程序。由于我是一名即将毕业的程序员,我希望有一个可靠的软件分支可以帮助我完成工作,直到我确定下一步该做什么(直到我对大局有一个很好的了解)。到现在为止,我刚
将包含列(例如“a”、“b”)的数据帧保存为 parquet,然后在稍后的时间点读取 parquet 不会提供相同的列顺序(可能是“b”、“a”fe)文件保存为。 不幸的是,我无法弄清楚订单是如何受到
我正在开发一个使用谷歌表格作为数据库的应用程序,但我不知道如何让 Swift 从谷歌表格中读取。我浏览了 API 网站和一些问题,但刚开始我需要一些帮助。到目前为止,我有; 私有(private)让范
我打算阅读swing concept,如果值得一读,请推荐一些学习 Material 最佳答案 自 AWT 崩溃以来,Java 的 GUI 工具包太多了。即使是 Swing 也被评论家严重低估,但他们
我已经使用 J 几个月了,我发现阅读不熟悉的代码(例如,不是我自己写的)是该语言最具挑战性的方面之一,尤其是在默认情况下。过了一会儿,我想出了这个策略: 1)将代码段复制到word文档中 2)从(1)
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我是一名优秀的程序员,十分优秀!