[英]How to solve pdf header signature not found error?
我在我的 java 程序中使用 iText 来编辑现有的 pdf。生成的 pdf 无法打开,它显示 pdf header signature not found 错误。我使用同名的输入和输出文件。
private static String INPUTFILE = "/sample.pdf";
private static String OUTPUTFILE = "/sample.pdf";
public static void main(String[] args)
throws DocumentException,
IOException
{
Document doc = new Document();
PdfWriter writer = PdfWriter.getInstance(doc,new FileOutputStream(OUTPUTFILE));
doc.open();
PdfReader reader = new PdfReader(INPUTFILE);
int n;
n = reader.getNumberOfPages();
System.out.println("No. of Pages :" +n);
for (int i = 1; i <= n; i++)
{
if (i == 1)
{
Rectangle rect = new Rectangle(85,650,800,833);
PdfFormField pushbutton = PdfFormField.createPushButton(writer);
pushbutton.setWidget(rect, PdfAnnotation.HIGHLIGHT_PUSH);
PdfContentByte cb = writer.getDirectContent();
PdfAppearance app = cb.createAppearance(380,201);
app.rectangle(62,100,50,-1);
app.fill();
pushbutton.setAppearance(PdfAnnotation.APPEARANCE_NORMAL,app);
writer.addAnnotation(pushbutton);
PdfImportedPage page = writer.getImportedPage(reader, i);
Image instance = Image.getInstance(page);
doc.add(instance);
}
然后尝试首先将输入文件重命名为.bak ,然后读取.bak并写入.pdf 。 这可以提供错误是与读取还是写入有关的线索。
Itext不是一个单一的 API,而是几个,混合在一起。 有时候挺难的。 我做了:
关闭PdfReader
和FileInputStream
。
关闭Document
和PdfWriter
。
您可能从空源或无效的 pdf 文件导入,在我的情况下 pdfCopy 不起作用,所以这是我使用的代码。
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, OutputStream );
PdfReader reader = new PdfReader(dato.getBinaryStream());
PdfImportedPage page1 = writer.getImportedPage(reader, 1);
PdfContentByte cb = writer.getDirectContent();
cb.addTemplate(page1, 1, 0, 0, 1, 0, 0);
document.setPageSize(new Rectangle(page1.getWidth(),page1.getHeight()) );
...
这应该有效。
在我的情况下,PDF 示例文件已损坏。 上传新文件它将起作用。
您应该使用PdfCopy
而不是PdfWriter.getInstance
,因为否则它无法更新PDF对象引用。
此外,您可以使用PdfCopy.addPage
方法,而不是向文档添加Image
,该方法接受PdfImportedPage
作为参数。
Document doc = new Document();
PdfCopy writer = new PdfCopy(doc,new FileOutputStream(OUTPUTFILE));
doc.open();
PdfReader reader = new PdfReader(INPUTFILE);
int n = reader.getNumberOfPages();
System.out.println("No. of Pages :" +n);
for (int i = 1; i <= n; i++) {
if (i == 1) {
// removed code for clarity
PdfImportedPage page = writer.getImportedPage(reader, i);
writer.addPage(page);
}
}
我遇到了同样的错误,我只是将 PdfReader 从读取 InputStreams 更改为读取 Strings。 所以,它完美地适用于:
public static void doMerge(List<String> list, OutputStream outputStream)
throws DocumentException, IOException {
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, outputStream);
document.open();
PdfContentByte cb = writer.getDirectContent();
for (String in : list) {
PdfReader reader = new PdfReader(in);
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
document.newPage();
// import the page from source pdf
PdfImportedPage page = writer.getImportedPage(reader, i);
// add the page to the destination pdf
cb.addTemplate(page, 0, 0);
}
}
outputStream.flush();
document.close();
outputStream.close();
}
*最初我从http://www.mindfiresolutions.com/Java-Merging-multiple-PDFs-into-a-single-PDF-using-iText-671.php 获取此代码
您的 pdf 应以%PDF开头。您可以检查它。我的文件已损坏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.