PdfCopy中的iText mergeFields创建无效的pdf

时间:2014-01-17 15:45:37

标签: java pdf itext acrofields

我正致力于使用iText 5.4.5合并一些输入PDF文档。输入文档可能包含也可能不包含AcroForms,我也想合并表单。

我正在使用找到here的示例pdf文件,这是代码示例:

public class TestForms {

 @Test
 public void testNoForms() throws DocumentException, IOException {
     test("pdf/hello.pdf", "pdf/hello_memory.pdf");
 }

 @Test
 public void testForms() throws DocumentException, IOException {
     test("pdf/subscribe.pdf", "pdf/filled_form_1.pdf");
 }

 private void test(String first, String second) throws DocumentException, IOException {
    OutputStream out = new FileOutputStream("/tmp/out.pdf");
    InputStream stream = getClass().getClassLoader().getResourceAsStream(first);
    PdfReader reader = new PdfReader(new RandomAccessFileOrArray(
            new RandomAccessSourceFactory().createSource(stream)), null);
    InputStream stream2 = getClass().getClassLoader().getResourceAsStream(second);
    PdfReader reader2 = new PdfReader(new RandomAccessFileOrArray(
            new RandomAccessSourceFactory().createSource(stream2)), null);

    Document pdfDocument = new Document(reader.getPageSizeWithRotation(1));
    PdfCopy pdfCopy = new PdfCopy(pdfDocument, out);
    pdfCopy.setFullCompression();
    pdfCopy.setCompressionLevel(PdfStream.BEST_COMPRESSION);
    pdfCopy.setMergeFields();
    pdfDocument.open();
    pdfCopy.addDocument(reader);
    pdfCopy.addDocument(reader2);
    pdfCopy.close();
    reader.close();
    reader2.close();
 }
}
  • 对于包含表单的输入文件,我会在启用或不启用压缩的情况下获得NullPointerException
  • 使用标准输入文档,会创建输出文件,但是当我使用Acrobat打开它时,它表示存在问题(14)并且没有显示任何内容。
  • 使用标准输入文档和压缩禁用,将创建输出,Acrobat将显示该输出。
问题
  • 我之前使用PdfCopyFields执行了此操作,但现在不推荐使用mergeFields中的布尔标记PdfCopy,这是正确的吗?那个标志上没有javadoc,我找不到关于它的文档。
  • 假设上一个问题的答案是肯定的,我的代码有什么问题吗? 感谢

3 个答案:

答案 0 :(得分:1)

我们正在使用PdfCopy来合并不同的文件,有些文件可能包含字段。我们使用版本5.5.3.0。代码很简单,似乎工作正常,但有时结果文件无法打印! 我们的代码:

Public Shared Function MergeFiles(ByVal sourceFiles As List(Of Byte())) As Byte()
        Dim document As New Document()
        Dim output As New MemoryStream()
        Dim copy As iTextSharp.text.pdf.PdfCopy = Nothing
        Dim readers As New List(Of iTextSharp.text.pdf.PdfReader) 
        Try
            copy = New iTextSharp.text.pdf.PdfCopy(document, output)
            copy.SetMergeFields()
            document.Open()
            For fileCounter As Integer = 0 To sourceFiles.Count - 1 
                Dim reader As New PdfReader(sourceFiles(fileCounter)) 
                reader.MakeRemoteNamedDestinationsLocal()
                readers.Add(reader)
                copy.AddDocument(reader)
            Next
        Catch exception As Exception
            Throw exception 
        Finally
            If copy IsNot Nothing Then copy.Close()
            document.Close()
            For Each reader As PdfReader In readers
                reader.Close()
            Next
        End Try
        Return output.GetBuffer()
    End Function

答案 1 :(得分:0)

您对PdfCopy.setMergeFields()的使用是正确的,您的合并代码也没问题。

您描述的问题是因为已经悄悄进入5.4.5的错误。它们应该以rev为单位。 6152,修正案将包含在下一个版本中。

感谢您引起我们的注意。

答案 2 :(得分:0)

它只是说我们有同样的问题: PdfCopy中的iText mergeFields创建无效的pdf 。因此,在 5.5.3.0

版本中仍未修复