Hello PdfBox Team,
I ran into a problem where PDFs programmatically created and merged using 
PdfBox fail to display all characters written in a type1 font.  When opening 
such a file with Adobe it shows the error message "Cannot find or create the 
font 'NotoSans'.  Some characters may not display or print correctly" and every 
character displays as a black dot.  

I believe that org.apache.pdfbox.multipdf.PDFMergerUtility has a bug where it 
is failing to subset type1 fonts for appended documents unless individual 
documents are saved first.

To reproduce the issue, I've included a minimal example below.  The example is 
based on one of the PdfBox examples except it loads a font from the filesystem 
and "merges" the single PDF.  If you run the code as-is, you'll get a PDF with 
the missing font.  If you run it again after uncommenting the line 
"document.save(new ByteArrayOutputStream());"  then the PDF contains the font 
and works properly.  

Thanks,

Jeffrey

                // Create a document and add a page to it
                PDDocument document = new PDDocument();
                PDPage page = new PDPage();
                document.addPage(page);

                // Create a new font object selecting one of the PDF base fonts
                // use a different font
                // PDFont font = PDType1Font.HELVETICA_BOLD;
                PDFont font = PDType0Font.load(document, new 
File("NotoSans/NotoSans-Regular.ttf"));

                // Start a new content stream which will "hold" the to be 
created content
                PDPageContentStream contentStream = new 
PDPageContentStream(document, page);

                // Define a text content stream using the selected font, moving 
the cursor and drawing the text "Hello World"
                contentStream.beginText();
                contentStream.setFont(font, 12);
                contentStream.moveTextPositionByAmount(100, 700);
                contentStream.drawString("Hello World");
                contentStream.endText();

                // Make sure that the content stream is closed:
                contentStream.close();

                // Save the results and ensure that the document is properly 
closed:
                // Uncomment the next line to make it work. Presumably because 
it subsets the fonts.
                // document.save(new ByteArrayOutputStream());

                PDFMergerUtility merger = new PDFMergerUtility();

                // Merge one document
                PDDocument outDoc = new PDDocument();
                for (PDDocument curDoc : Arrays.asList(document))
                {
                        merger.appendDocument(outDoc, curDoc);
                        curDoc.close();
                }

                outDoc.save("Merged.pdf");
                outDoc.close();

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@pdfbox.apache.org
For additional commands, e-mail: users-h...@pdfbox.apache.org

Reply via email to