Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

setCompressionLevel(0) but wit PDFBox?

I know that in iText, we have the "setCompressionLevel(0)" command in order to be able to show the file Structure in a more visible way. But now, i am using PDFBox. So how compress level 0 with PDFBox? I created a PDF document with PDFBox containing "hello world" as string. When i open the file structure, i noticed the following stream :

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

My problem is which command must be used in order to show the following stream:

stream
<hello world>Tj
endStream

Thanks in advance. Liszt


this is my code, i also get the same problem while i use the 4 parameters.

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();       
    }
like image 252
Liszt Avatar asked Feb 13 '26 05:02

Liszt


1 Answers

In contrast to iText, PDFBox does not provide a global setting controlling the compression of the PDF. You can control compression on a per-stream basis, though:

I assume you used a PDPageContentStream instance to generate the page content stream of your PDF (otherwise please supply code) and instantiated that class using the 2-parameter constructor

public PDPageContentStream( PDDocument document, PDPage sourcePage )
    throws IOException

This constructor replaces the current page content of the page (if any) and requests compression.

If you use the 4-parameter constructor instead, you can control these behaviors:

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

PS: In a comment you said that with compression deactivated you get

<4C61205374E967616E6F677261706869652064616E7320504446> Tj

but would prefer a regular, not hex-encoded string.

PDFBox here uses the hex-encoded string variant because your text "La Stéganographie dans PDF" contains a character whose character code is outside the ASCII'ish range 0..127, namely the 'é'. COSString.writePDF (which is used by PDPageContentStream.drawString) in such a case automatically uses the hex-encoded string form.

If you don't want that for your string, you have to construct the string drawing command yourself. Instead of

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

you could write something like

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

Beware: This obviously only works as long as your string only contains character in the ISO-8859-1 range (because appendRawCommands underneath retrieves the bytes for that encoding) and the encoding of your font coincides with ISO-8859-1 at least for the characters involved.

like image 127
mkl Avatar answered Feb 15 '26 18:02

mkl



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!