错误:标头不包含版本信息

发布于 2025-01-15 14:22:51 字数 3859 浏览 2 评论 0原文

我正在尝试动态创建一些 pdf 页面并使用 PDFBox PDFMergerUtility 合并它们。基本上我已经设置了要合并的文档,现在我想在顶部添加一个带有一些动态文本和图像的封面页。

PDFMergerUtility ut = new PDFMergerUtility();

        // Creating PDF document object
        PDDocument document = new PDDocument();

        PDPage blankPage = new PDPage();
        // Adding the blank page to the document
        document.addPage(blankPage);

        // Start a new content stream which will "hold" the to be created content
        PDPageContentStream contentStream = new PDPageContentStream(document, blankPage);

        // Define a text content stream using the selected font, moving the cursor and
        // drawing the text "Hello World"
        contentStream.beginText();
        // Setting the font to the Content stream
        contentStream.setFont(PDType1Font.TIMES_ROMAN, 12);

        // Setting the position for the line
        contentStream.newLineAtOffset(25, 500);

        String text = "This is the sample document and we are adding content to it.";

        // Adding text in the form of string
        contentStream.showText(text);
        contentStream.endText();

        // Make sure that the content stream is closed:
        contentStream.close();

        ut.addSource(document.getPage(0).getContents());

    
        // Save the merged pdf to outputstream
        ByteArrayOutputStream destStream = new ByteArrayOutputStream();
        ut.setDestinationStream(destStream);
        ut.mergeDocuments(MemoryUsageSetting.setupTempFileOnly());

但我收到以下错误:

java.io.IOException: Error: Header doesn't contain versioninfo
        at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:175)
        at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:154)
        at org.apache.pdfbox.Loader.loadPDF(Loader.java:456)
        at org.apache.pdfbox.Loader.loadPDF(Loader.java:377)
        at org.apache.pdfbox.multipdf.PDFMergerUtility.legacyMergeDocuments(PDFMergerUtility.java:457)
        at org.apache.pdfbox.multipdf.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:355)
        at org.apache.pdfbox.multipdf.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:339)
        at com.iof.services.AuditDocumentService.mergeAttachments(AuditDocumentService.java:210)
        at com.iof.services.AuditDocumentService.downloadAuditDocument(AuditDocumentService.java:118)
        at com.iof.services.AuditDocumentService.lambda$0(AuditDocumentService.java:95)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
        at com.iof.services.AuditDocumentService.downloadAuditDocument(AuditDocumentService.java:85)
        at com.iof.schedulers.AuditDocumentScheduler.downloadAuditDocument(AuditDocumentScheduler.java:17)
        at jdk.internal.reflect.GeneratedMethodAccessor73.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84)
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
        at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
        at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at java.base/java.lang.Thread.run(Thread.java:833)

有人可以帮助我解决我做错的事情吗?

I'm trying to create some pdf pages on the fly and merging them using PDFBox PDFMergerUtility. Basically I've set of documents to be merged and now I want to add a cover page at the top with some dynamic text and image.

PDFMergerUtility ut = new PDFMergerUtility();

        // Creating PDF document object
        PDDocument document = new PDDocument();

        PDPage blankPage = new PDPage();
        // Adding the blank page to the document
        document.addPage(blankPage);

        // Start a new content stream which will "hold" the to be created content
        PDPageContentStream contentStream = new PDPageContentStream(document, blankPage);

        // Define a text content stream using the selected font, moving the cursor and
        // drawing the text "Hello World"
        contentStream.beginText();
        // Setting the font to the Content stream
        contentStream.setFont(PDType1Font.TIMES_ROMAN, 12);

        // Setting the position for the line
        contentStream.newLineAtOffset(25, 500);

        String text = "This is the sample document and we are adding content to it.";

        // Adding text in the form of string
        contentStream.showText(text);
        contentStream.endText();

        // Make sure that the content stream is closed:
        contentStream.close();

        ut.addSource(document.getPage(0).getContents());

    
        // Save the merged pdf to outputstream
        ByteArrayOutputStream destStream = new ByteArrayOutputStream();
        ut.setDestinationStream(destStream);
        ut.mergeDocuments(MemoryUsageSetting.setupTempFileOnly());

But I'm getting following error:

java.io.IOException: Error: Header doesn't contain versioninfo
        at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:175)
        at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:154)
        at org.apache.pdfbox.Loader.loadPDF(Loader.java:456)
        at org.apache.pdfbox.Loader.loadPDF(Loader.java:377)
        at org.apache.pdfbox.multipdf.PDFMergerUtility.legacyMergeDocuments(PDFMergerUtility.java:457)
        at org.apache.pdfbox.multipdf.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:355)
        at org.apache.pdfbox.multipdf.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:339)
        at com.iof.services.AuditDocumentService.mergeAttachments(AuditDocumentService.java:210)
        at com.iof.services.AuditDocumentService.downloadAuditDocument(AuditDocumentService.java:118)
        at com.iof.services.AuditDocumentService.lambda$0(AuditDocumentService.java:95)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
        at com.iof.services.AuditDocumentService.downloadAuditDocument(AuditDocumentService.java:85)
        at com.iof.schedulers.AuditDocumentScheduler.downloadAuditDocument(AuditDocumentScheduler.java:17)
        at jdk.internal.reflect.GeneratedMethodAccessor73.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84)
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
        at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
        at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at java.base/java.lang.Thread.run(Thread.java:833)

Can someone help me with what I'm doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

药祭#氼 2025-01-22 14:22:51

ut.addSource(document.getPage(0).getContents())

是错误的,PDFMergerUtility 期望 PDF 文档作为源,但 PDPage.getContents() 仅返回某些页面的内容流。

相反,将 document 保存到某个 ByteArrayOutputStream 中,并将该流的内容作为源添加到 ut 中。

You do

ut.addSource(document.getPage(0).getContents())

This is wrong, PDFMergerUtility expects PDF documents as sources but PDPage.getContents() only returns the content stream of some page.

Instead save document to some ByteArrayOutputStream and add the contents of that stream as source to ut.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文