设置压缩级别(0),但使用PDFBox



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

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();       
    }

与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) Tjn");

注意:这显然只适用于字符串只包含ISO-8859-1范围内的字符的情况(因为下面的appendRawCommands检索该编码的字节),并且字体的编码至少与所涉及的字符的ISO-8859-1。

最新更新