当前位置: 首页 > 知识库问答 >
问题:

PdfCopy和PdfACopy之间的差异

吴鸿禧
2023-03-14

我编写了一个函数,使用iText 5.5.13(使用iText教程中的说明)将文件作为附件嵌入到PDF/A-3A文档中。

如果我使用类PdfCopy附加文件,结果是一个正确的PDF文件,但它并不声称是PDF/a(也许它匹配了所有的要求,但它没有说)。

public static File embedFile(File inputPdf) {

    File outputPdf = new File("./test.pdf");

    PdfReader reader = new PdfReader(inputPdf.getAbsolutePath());
    Document document = new com.itextpdf.text.Document();
    OutputStream os = new FileOutputStream(outputPdf.getAbsolutePath());
    PdfACopy copy = new PdfACopy(document, os, PdfAConformanceLevel.PDF_A_3A); // Output doc doesn't work
    // PdfCopy copy = new PdfCopy(document, os); // Output doc works but doesn't claim to be PDF/A

    document.open();
    copy.addDocument(reader);

    // Include attachment (extactly as in the sample tutorial)
    PdfDictionary parameters = new PdfDictionary();
    parameters.put(PdfName.MODDATE, new PdfDate());
    PdfFileSpecification fileSpec = PdfFileSpecification.fileEmbedded(
        writer, "./src/main/resources/com/itextpdf/invoice.xml",
        "invoice.xml", null, "application/xml", parameters, 0);
    fileSpec.put(new PdfName("AFRelationship"), new PdfName("Data"));
    writer.addFileAttachment("invoice.xml", fileSpec);
    PdfArray array = new PdfArray();
    array.add(fileSpec.getReference());
    writer.getExtraCatalog().put(new PdfName("AF"), array);

    os.flush();
    reader.close();
    document.close();
    os.close();
    copy.close();

    return outputPdf;
}

共有1个答案

全昊焜
2023-03-14

正如Bruno Lowagie在评论中指出的,这在iText 7中是可能的。这里的函数可以帮助某人:

public static File embedFile(File inputPdf, File embeddedFile, String embeddedFileName, String embeddedFileMimeType)
        throws IOException {

    File outputPdf = new File("./test.pdf");

    PdfReader reader = new PdfReader(inputPdf.getAbsolutePath());
    PdfWriter writer = new PdfWriter(outputPdf.getAbsolutePath());
    PdfADocument pdfDoc = new PdfADocument(reader, writer);

    // Add attachment
    PdfDictionary parameters = new PdfDictionary();
    parameters.put(PdfName.ModDate, new PdfDate().getPdfObject());
    PdfFileSpec fileSpec = PdfFileSpec.createEmbeddedFileSpec(pdfDoc, embeddedFile.getAbsolutePath(), embeddedFileName,
            embeddedFileName, new PdfName(embeddedFileMimeType), parameters, PdfName.Data);
    fileSpec.put(new PdfName("AFRelationship"), new PdfName("Data"));
    pdfDoc.addFileAttachment(embeddedFileName, fileSpec);
    PdfArray array = new PdfArray();
    array.add(fileSpec.getPdfObject().getIndirectReference());
    pdfDoc.getCatalog().put(new PdfName("AF"), array);

    pdfDoc.close();
    reader.close();
    writer.close();

    return outputPdf;

}
 类似资料:
  • 问题内容: 很快就有两个相等运算符:double equals( )和Triple equals( ),两者之间有什么区别? 问题答案: 简而言之: 操作员检查其实例值是否相等, 操作员检查引用是否指向同一实例, 长答案: 类是引用类型,可能有多个常量和变量在幕后引用类的同一单个实例。类引用保留在运行时堆栈(RTS)中,其实例保留在内存的堆区域中。当您控制平等时, 这意味着它们的实例是否彼此相等。

  • 我编写了一个简单的脚本,它接受任意数量的参数来演示< code>$@和< code>$*之间的区别: 在我做的 CLI 上 这就是打印出来的 因为它们是相同的,这是否意味着等于?还是我遗漏了一点?

  • 问题内容: package main 该代码可以很好地工作。但是,如果按如下所示更改方法,则会导致死循环。区别在于将替换为。为什么? 问题答案: 因为程序包检查要打印的值是否具有方法(或换句话说:是否实现接口),如果是,则将调用它以获取值的表示形式。 软件包doc中对此进行了说明: […]如果操作数实现String()字符串方法,则将调用该方法将对象转换为字符串,然后根据动词的要求对其进行格式化(

  • 我正在通过做微控制器项目来自学C++。我当前的项目是使用一对或Adafruit羽毛分组无线电。无线电数据包的库函数需要一个C样式的字符串(我相信),我理解它是一个char的数组。 我已经设置了一个枚举来反映接收方的各种操作,并希望将该状态发送回发送方。所以我想把枚举变成char的数组。 在搜索将枚举转换为char数组的方法时,最简单的方法(对我来说)是将枚举变量传递给带有switch语句的函数,该

  • 我是Hadoop的新手。我正在浏览专业Hadoop解决方案的书,以获得一些关于Hadoop和生态系统的知识。我想澄清HDFS和HBase之间的主要区别是什么。我理解的方式就像两者都是存储系统。它们的区别只是在访问数据方面。HBase通过非关系型数据库访问数据,HDFS使用计算框架(MapReduce)处理数据。如果是这种情况,为什么我们不能只有一个存储HDFS或HBase。根据需求,他们将插入和插

  • 有人能解释一下 和 我不知道确切的意思。