3

我知道在 iText 中,我们有“setCompressionLevel(0)”命令,以便能够以更明显的方式显示文件结构。但现在,我正在使用 PDFBox。那么如何使用 PDFBox 压缩级别 0 呢?我使用包含“hello world”作为字符串的 PDFBox 创建了一个 PDF 文档。当我打开文件结构时,我注意到以下流:

stream
xœs
áÒw3P04RIã24U0¶0UIáÒÈHÍÉÉW(Ï/ÊIÑTÉâr
á
endStream

我的问题是必须使用哪个命令才能显示以下流:

stream
<hello world>Tj
endStream

提前致谢。李斯特


这是我的代码,我在使用 4 个参数时也遇到了同样的问题。

public static void CreatePdf(String src) throws IOException, COSVisitorException{
    PDRectangle rec= new PDRectangle(400,400);
    PDDocument document= null;
    document = new PDDocument();
    PDPage page = new PDPage(rec);
    document.addPage(page);
    PDDocumentInformation info=document.getDocumentInformation();
 PDStream stream= new PDStream(document);
 stream.addCompression();

    info.setAuthor("PdfBox");
    info.setCreator("Pdf");
    info.setSubject("Stéganographie");
    info.setTitle("Stéganographie dans les documents PDF");
    info.setKeywords("Stéganographie, pdf");
    content= new PDPageContentStream(document, page, true, true );
    font= PDType1Font.HELVETICA;
    String texte="La Stéganographie dans PDF";

    content.beginText();
    content.setFont(font, 12);
    content.moveTextPositionByAmount(15, 385);   
    // content.appendRawCommands("3 Tr");
    content.drawString(texte);
    content.endText();
   content.close();
    document.save("doc.pdf");
    document.close();       
    }
4

1 回答 1

4

与 iText 相比,PDFBox 不提供控制 PDF 压缩的全局设置。但是,您可以基于每个流控制压缩:

我假设您使用了一个PDPageContentStream实例来生成 PDF 的页面内容流(否则请提供代码)并使用 2 参数构造函数实例化该类

public PDPageContentStream( PDDocument document, PDPage sourcePage )
    throws IOException

此构造函数替换页面的当前页面内容(如果有)并请求压缩。

如果您改用 4 参数构造函数,则可以控制以下行为:

public PDPageContentStream( PDDocument document, PDPage sourcePage,
    boolean appendContent, boolean compress ) throws IOException

PS:在评论中你说禁用压缩后你会得到

<4C61205374E967616E6F677261706869652064616E7320504446> Tj

但更喜欢常规的,而不是十六进制编码的字符串。

PDFBox 在这里使用十六进制编码的字符串变体,因为您的文本“La Stéganographie dans PDF”包含一个字符,其字符代码超出 ASCII'ish 范围 0..127,即'é'。COSString.writePDF(由 使用PDPageContentStream.drawString)在这种情况下会自动使用十六进制编码的字符串形式。

如果你不希望你的字符串使用它,你必须自己构造字符串绘制命令。代替

pageContentStream.drawString("La Stéganographie dans PDF");

你可以写一些像

pageContentStream.appendRawCommands("(La Stéganographie dans PDF) Tj\n");

当心:这显然只适用于您的字符串仅包含 ISO-8859-1 范围内的字符(因为appendRawCommands下面检索该编码的字节)并且您的字体编码至少与 ISO-8859-1 一致涉及。

于 2013-08-06T07:34:04.273 回答