如何解决pdf标题签名未找到错误?

问题描述 投票:0回答:7

我在我的java程序中使用iText来编辑现有的pdf。生成的pdf无法打开,它显示未找到pdf标题签名错误。我使用相同名称的输入和输出文件。

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);
                }
java pdf itext
7个回答
9
投票

然后首先尝试将输入文件重命名为.bak,然后读取.bak,然后写入.pdf。这可以给出错误是否与读取或写入有关的线索。

Itext 不是单个 API,而是多个 API 混合在一起。有时相当难。我做到了:

关闭

PdfReader
FileInputStream

关闭

Document
PdfWriter


5
投票

您可能从空源或无效的 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()) );

...

这应该有效。


4
投票

就我而言,PDF 示例文件已损坏。上传新文件就可以了。


3
投票

您应该使用

PdfCopy
而不是
PdfWriter.getInstance
,否则它无法更新 PDF 对象引用。

此外,您可以使用

Image
方法,该方法接受
PdfCopy.addPage
作为参数,而不是向文档添加
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);
            }
}

2
投票

我有同样的错误,我只是将我的 PdfReader 从读取 InputStreams 更改为读取字符串。因此,它可以完美地配合:

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

获取此代码

1
投票

您的 pdf 应该以 %PDF 开头。您可以检查一下。我的文件已损坏。


0
投票

您的 pdf 字节应以“%PDF-”开头 @Melahat Mindivanli 答案不是 100% 正确。

这是验证码:

 public char checkPdfHeader() throws IOException {
    file.setStartOffset(0);
    String str = readString(1024);
    int idx = str.indexOf("%PDF-");
    if (idx < 0)
        throw new IOException("PDF header signature not found.");
    file.setStartOffset(idx);
    return str.charAt(idx + 7);
}
© www.soinside.com 2019 - 2024. All rights reserved.