我知道在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。