I'm having problems with pdfbox 2.0.2 writing a pdf document from elements of a previously read document (https://www.dropbox.com/s/ttxiv0dq3abh5kj/Test.pdf?dl=0). Everything works fine, except when I call showText
on a PDPageContentStream where I previously set the font with out.setFont(textState.getFont(), textState.getFontSize())
(see the INFORMATION log) and the font is ComicSansMS or ArialBlack. textState
is (a clone from) the state from the previously read document. Writing text with Helvetica or Times-Roman works fine.
INFORMATION: set font PDTrueTypeFont RXNQOL+ComicSansMS,Bold/18.0 embedded SEVERE: error writing <w>U+0077 is not available in this font's encoding: built-in (TTF)
I suppose the problem may be caused by a missing hyphen or blank in the font name but have no clue how to fix this.
Here is the complete code
import java.awt.Point; import java.awt.geom.Point2D; import java.io.File; import java.io.IOException; import org.apache.pdfbox.contentstream.PDFGraphicsStreamEngine; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.font.PDFont; import org.apache.pdfbox.pdmodel.graphics.image.PDImage; import org.apache.pdfbox.pdmodel.graphics.state.PDTextState; import org.apache.pdfbox.util.Matrix; import org.apache.pdfbox.util.Vector; public class Test extends PDFGraphicsStreamEngine { public static void main(String[] args) throws IOException { test(); } public static void test() throws IOException { PDDocument document = PDDocument.load(new File("Test.pdf")); PDPage pageIn = document.getPage(0); PDDocument saveDoc = new PDDocument(); PDPage savePage = new PDPage(pageIn.getMediaBox()); saveDoc.addPage(savePage); try (PDPageContentStream out = new PDPageContentStream(saveDoc, savePage)) { Test test = new Test(pageIn, out); test.processPage(pageIn); } } private final PDPageContentStream out; public Test(PDPage pageIn, PDPageContentStream out) { super(pageIn); this.out = out; } @Override public void appendRectangle(Point2D p0, Point2D p1, Point2D p2, Point2D p3) throws IOException { } @Override public void clip(int windingRule) throws IOException { } @Override public void closePath() throws IOException { } @Override public void curveTo(float x1, float y1, float x2, float y2, float x3, float y3) throws IOException { } @Override public void drawImage(PDImage pdImage) throws IOException { } @Override public void endPath() throws IOException { } @Override public void fillAndStrokePath(int windingRule) throws IOException { } @Override public void fillPath(int windingRule) throws IOException { } @Override public Point2D getCurrentPoint() { return new Point(0, 0); } @Override public void lineTo(float x, float y) throws IOException { } @Override public void moveTo(float x, float y) throws IOException { } @Override public void shadingFill(COSName shadingName) throws IOException { } @Override protected void showGlyph(Matrix textRenderingMatrix, PDFont font, int code, String unicode, Vector displacement) throws IOException { super.showGlyph(textRenderingMatrix, font, code, unicode, displacement); PDTextState textState = getGraphicsState().getTextState(); out.beginText(); out.setTextMatrix(getTextMatrix()); out.setFont(textState.getFont(), textState.getFontSize()); out.showText(unicode); out.endText(); } @Override public void strokePath() throws IOException { } }
Any suggestions?
Thanks, Juergen