- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用PDFbox填充重复的表单。我正在使用TreeMap并使用单个记录填充表单。 pdf格式的格式是在第一页上列出了六个记录,在第二页上插入了一个静态页。 (对于大于六个记录的TreeMap,将重复此过程)。我得到的错误特定于TreeMap的大小。这就是我的问题。我不知道为什么当我用超过35个条目填充TreeMap时收到此警告:
2018年4月23日2:36:25 org.apache.pdfbox.cos.COSDocument最终定稿
警告:警告:您没有关闭PDF文档
public class test {
public static void main(String[] args) throws IOException, IOException {
// TODO Auto-generated method stub
File dataFile = new File("dataFile.csv");
File fi = new File("form.pdf");
Scanner fileScanner = new Scanner(dataFile);
fileScanner.nextLine();
TreeMap<String, String[]> assetTable = new TreeMap<String, String[]>();
int x = 0;
while (x <= 36) {
String lineIn = fileScanner.nextLine();
String[] elements = lineIn.split(",");
elements[0] = elements[0].toUpperCase().replaceAll(" ", "");
String key = elements[0];
key = key.replaceAll(" ", "");
assetTable.put(key, elements);
x++;
}
PDDocument newDoc = new PDDocument();
int control = 1;
PDDocument doc = PDDocument.load(fi);
PDDocumentCatalog cat = doc.getDocumentCatalog();
PDAcroForm form = cat.getAcroForm();
for (String s : assetTable.keySet()) {
if (control <= 6) {
PDField IDno1 = (form.getField("IDno" + control));
PDField Locno1 = (form.getField("locNo" + control));
PDField serno1 = (form.getField("serNo" + control));
PDField typeno1 = (form.getField("typeNo" + control));
PDField maintno1 = (form.getField("maintNo" + control));
String IDnoOne = assetTable.get(s)[1];
//System.out.println(IDnoOne);
IDno1.setValue(assetTable.get(s)[0]);
IDno1.setReadOnly(true);
Locno1.setValue(assetTable.get(s)[1]);
Locno1.setReadOnly(true);
serno1.setValue(assetTable.get(s)[2]);
serno1.setReadOnly(true);
typeno1.setValue(assetTable.get(s)[3]);
typeno1.setReadOnly(true);
String type = "";
if (assetTable.get(s)[5].equals("1"))
type += "Hydrotest";
if (assetTable.get(s)[5].equals("6"))
type += "6 Year Maintenance";
String maint = assetTable.get(s)[4] + " - " + type;
maintno1.setValue(maint);
maintno1.setReadOnly(true);
control++;
} else {
PDField dateIn = form.getField("dateIn");
dateIn.setValue("1/2019 Yearlies");
dateIn.setReadOnly(true);
PDField tagDate = form.getField("tagDate");
tagDate.setValue("2019 / 2020");
tagDate.setReadOnly(true);
newDoc.addPage(doc.getPage(0));
newDoc.addPage(doc.getPage(1));
control = 1;
doc = PDDocument.load(fi);
cat = doc.getDocumentCatalog();
form = cat.getAcroForm();
}
}
PDField dateIn = form.getField("dateIn");
dateIn.setValue("1/2019 Yearlies");
dateIn.setReadOnly(true);
PDField tagDate = form.getField("tagDate");
tagDate.setValue("2019 / 2020");
tagDate.setReadOnly(true);
newDoc.addPage(doc.getPage(0));
newDoc.addPage(doc.getPage(1));
newDoc.save("PDFtest.pdf");
Desktop.getDesktop().open(new File("PDFtest.pdf"));
}
WARNING: Warning: You did not close a PDF Document
Exception in thread "main" java.io.IOException: COSStream has been closed and cannot be read. Perhaps its enclosing PDDocument has been closed?
at org.apache.pdfbox.cos.COSStream.checkClosed(COSStream.java:77)
at org.apache.pdfbox.cos.COSStream.createRawInputStream(COSStream.java:125)
at org.apache.pdfbox.pdfwriter.COSWriter.visitFromStream(COSWriter.java:1200)
at org.apache.pdfbox.cos.COSStream.accept(COSStream.java:383)
at org.apache.pdfbox.cos.COSObject.accept(COSObject.java:158)
at org.apache.pdfbox.pdfwriter.COSWriter.doWriteObject(COSWriter.java:522)
at org.apache.pdfbox.pdfwriter.COSWriter.doWriteObjects(COSWriter.java:460)
at org.apache.pdfbox.pdfwriter.COSWriter.doWriteBody(COSWriter.java:444)
at org.apache.pdfbox.pdfwriter.COSWriter.visitFromDocument(COSWriter.java:1096)
at org.apache.pdfbox.cos.COSDocument.accept(COSDocument.java:419)
at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1367)
at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1254)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1232)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1204)
at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1192)
at test.test.main(test.java:87)
最佳答案
警告本身
您似乎听错了警告。它说:
警告:您没有关闭PDF文档
因此,与您的想法相反,“ PDFbox说PDDocument在未关闭时关闭”,PDFBox说您没有关闭文档!
编辑后,您会看到它实际上是说COSStream
已被关闭,可能的原因是封闭的PDDocument
已被关闭。这仅仅是可能性!
您的警告
话虽如此,通过将一个文档中的页面添加到另一个文档中,您可能最终会引用两个文档中的这些页面。在那种情况下,在关闭两个文档的过程中(例如,通过垃圾回收自动关闭),第二次关闭实际上可能偶然遇到了一些已经关闭的COSStream
实例。
因此,我的第一个建议是最后简单地关闭文档
doc.close();
newDoc.close();
doc
和
newDoc
,甚至创建了新的
PDDocument
实例并将它们一次又一次地分配给
doc
,在此过程中,该变量中的前一个文档对象设置为无垃圾采集。因此,一旦不再引用,您最终将关闭一大堆文档。
doc
中的所有这些文档不是一个好主意,尤其是在保存
newDoc
之前。
PDDocument
实例收集在某个
Collection
中,并在保存
newDoc
之后立即将其明确关闭然后清除收藏集。
PDDocument
实例之一已被垃圾回收所关闭,因此,即使使用简单的单发实用程序,也应收集文档,以防止它们被GC处理。
newDoc.addPage(doc.getPage(0));
newDoc.addPage(doc.getPage(1));
newDoc.addPage(newDoc.importPage(doc.getPage(0)));
newDoc.addPage(newDoc.importPage(doc.getPage(1)));
PDDocument
中的每个
doc
实例。
PDAcroForm
中访问字段,但不要将其添加到合并结果文档的
PDAcroForm
中。
PDFMergerUtility
在后台进行这样的重命名。有关该实用工具类的用法示例,请参见
PDFMergerExample
。
关于java - PDFbox表示PDDocument在未关闭时关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49972707/
我正在尝试通过org.apache.pdfbox.multipdf.Splitter拆分pdf文档,并且需要在此单页PDDocument上执行某些文件操作, 如何将 PDDocument 转换为 Ja
我正在尝试创建一个PDDocument,然后向其中添加两个页面。第一个包含文本“第一页”,第二个为空白。然后,我拆分 PDDocument 并将其放入列表中。当我尝试访问第一页(通过使用 get 方法
您是否只需要在加载/保存操作后或创建每个新的 PDDocument 对象后关闭 PDDocument(例如,在执行合并/拆分/...操作时)? 例如,我有 3 个从字节数组加载的 PDDocument
我用 iText 创建了一个文档,我想将该文档(保存为 PDF 文件)转换为图像。为此,我使用 PDFBox,它需要一个 PDDocument 作为输入。我使用以下代码: @SuppressWarni
我正在尝试从 PDDocument 中检索 File 或 InputStream 实例,而不将 PDDocument 保存到文件中系统。 PDDocument doc= new PDDocument
PDPage 对象是否包含对其所属的 PDDocument 的引用? 换句话说,PDPage 是否了解其 PDDocument? 在应用程序的某个位置我有一个 PDDocuments 列表。 这些文档
本质上,我试图用 Java 创建一个小工具,从某种用户输入中获取文本,考虑一个普通的文本框,并用它创建一个 PDF 文件。 到目前为止,我已经成功地利用我对 PDFBox 的基本知识快速地抓取了一些东
我目前使用 PdfBox 作为 pdf 文件编辑器应用程序的驱动程序。我需要将 pdf 文件 (PDDocument) 的 PdfBox 表示形式的内容作为字节数组。有谁知道如何做到这一点? 最佳答案
我正在尝试使用 PDFBOX 从 pdf 中获取文本,我正在开发一个 Maven jee 项目,我已经包含了所有可能的依赖项,但我仍然遇到下一个错误 `2017-01-29T16:01:50.069+
我越来越熟悉 PDFBox 的各种风格。我想知道是否有办法将 pdf-layout 元素放入 PDDocument 对象中。 pdf-layout 元素使用 Document 作为父元素,PDFBox
我在编译过程中遇到以下错误。我正在使用 Eclipse IDE 并在 Ubuntu 上工作。我在构建路径中添加了以下 jar 文件 1) pdfbox 1.8.13 及其所有依赖项 2) Common
我正在使用 Pdfbox (1.8.8) 将附件添加到 pdf。我的问题是,当其中一个附件的类型为 .pdf 并且我将 PDDocument 保存到 OutputStream 时,最终的 pdf 文档
我有一些关于解析 pdf 和 fd 的问题: 使用的目的是什么 PDDocument.loadNonSeq 方法包含临时/临时文件? 我有一个很大的 pdf 文件,我需要解析它并获取文本内容。我使用
我想验证创建的pdf(不是作为文件),而是作为下载到浏览器的ByteArrayOutputStream。为了避免安全问题,可能想使用 pdfbox preflightparser 进行验证,其中它只能
我制作了一个 pdf 表格,我正在尝试使用 pdfBox 填写表格并打印文档。我让它非常适合 1 页打印作业,但我不得不尝试修改多页。基本上它是一个顶部有基本信息和内容列表的表格。好吧,如果内容大于表
我已经在以前的版本中看到了如何执行此操作,如下所示: How to extract font styles of text contents using pdfbox? 但我认为 getFonts()
如何使用PDFBox 2.0.0中的分页功能。我使用 PDFBox 1.8.3 完成我的申请。我可以使用 PDFBox 1.8.3 将文档设置为可分页格式。但我无法在 2.0.0 中将文档设置为可分页
我正在使用 PDFBox从我的网络应用程序创建 PDF。 Web 应用程序是用 Java 构建的,并使用 JSF。它从基于 Web 的表单中获取内容并将内容放入 PDF 文档中。 示例:用户在表单中填
我正在尝试使用 PDDocument 在 Java 中创建临时 PDF 文件。我正在使用以下方法创建临时 PDF 文件。 /* Create a temporary PDF file.*/ priva
我使用的是 PDFBOX 1.8.10。 如果我将 PDF 文件加载到字节数组中,它就可以工作 - File file = new File(args[0]); FileInputStream fis
我是一名优秀的程序员,十分优秀!