【问题标题】:How to solve pdf header signature not found error?如何解决 pdf header signature not found 错误?
【发布时间】:2012-01-29 02:44:06
【问题描述】:

我在我的 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);
                }

【问题讨论】:

  • 如果您向我们展示您的代码会更好
  • @Francisco Puga....以上是我的代码
  • 我认为您应该使用此答案中给出的建议更新您的代码stackoverflow.com/a/8655157/930271

标签: java pdf itext


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在我的情况下,PDF 示例文件已损坏。上传新文件就可以了。

    【讨论】:

      【解决方案3】:

      我遇到了同样的错误,我只是将我的 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获取此代码

      【讨论】:

        【解决方案4】:

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

        ...

        这应该可行。

        【讨论】:

        • 你能在 dato.getBinaryStream() 中定义“dato”吗?谢谢
        【解决方案5】:

        您应该使用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);
                    }
        }
        

        【讨论】:

          【解决方案6】:

          然后尝试首先将输入文件重命名为 .bak,然后读取 .bak,然后写入 .pdf。这可以提供一个线索,是错误是读取还是写入。

          Itext 不是一个单一的 API,而是几个混合在一起的 API。有时候挺难的。我做到了:

          关闭PdfReaderFileInputStream

          关闭DocumentPdfWriter

          【讨论】:

          • 关闭流帮助我!谢谢。
          • 完全关闭流很重要.. 非常感谢
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-17
          • 1970-01-01
          相关资源
          最近更新 更多