如何在PDFBox中使用不同的字体写入多个字符串

问题描述

到目前为止,我想生成具有多个字符串的PDF文件标题,副标题

  • 标题:位于页面顶部,居中对齐,字体:Times Roman,字体大小:18
  • 字幕:位于标题下方一点,左对齐,字体:信使,字体大小:14

我正在将Apache PDFBox 2.0.21与Java 11一起使用。

我写了以下代码

    String title = "Title Goes Here";
    String subTitle = "Subtitle goes here\nTime goes here";
    try(PDDocument document = new PDDocument()){
        PDPage page = new PDPage();

        float px,py;
        int hMargin = 5;
        int vMargin = 10;

        // Writing Title
        PDPageContentStream titleContentStream = new PDPageContentStream(document,page,PDPageContentStream.AppendMode.APPEND,false);
        PDFont titleFont = PDType1Font.TIMES_ROMAN;
        float titleFontSize = 18;
        float titleWidth = titleFont.getStringWidth(title)/1000*titleFontSize;
        float titleHeight = titleFont.getFontDescriptor().getFontBoundingBox().getHeight()/1000*titleFontSize;
        titleContentStream.beginText();
        titleContentStream.setFont(titleFont,titleFontSize);
        px = (page.getMediaBox().getWidth() - titleWidth - (2*hMargin))/2;
        py = page.getMediaBox().getHeight() - titleHeight - vMargin;
        titleContentStream.newLineatoffset(px,py);
        titleContentStream.showtext(title);
        titleContentStream.endText();
        titleContentStream.close();


        // Writing Subtitle
        PDPageContentStream subtitleContentStream = new PDPageContentStream(document,false);
        PDFont subtitleFont = PDType1Font.COURIER_BOLD;
        float subtitleFontSize = 14;
        float subTitleWidth = subtitleFont.getStringWidth(title)/1000*subtitleFontSize;
        float subTitleHeight = subtitleFont.getFontDescriptor().getFontBoundingBox().getHeight()/1000*subtitleFontSize;
        subtitleContentStream.beginText();
        subtitleContentStream.setFont(subtitleFont,subtitleFontSize);
        px = hMargin;
        py = page.getMediaBox().getHeight() - titleHeight - vMargin - subTitleHeight - 5;
        subtitleContentStream.newLineatoffset(px,py);
        subtitleContentStream.showtext(subTitle);
        subtitleContentStream.endText();
        subtitleContentStream.close();

        document.addPage(page);

        document.save("hello.pdf");

    } catch (IOException e) {
        e.printstacktrace();
    }

运行代码时出现以下错误

Sep 06,2020 11:03:47 PM org.apache.pdfBox.pdmodel.PDPageContentStream <init>
WARNING: You are overwriting an existing content,you should use the append mode
Exception in thread "main" java.lang.IllegalArgumentException: U+000A ('controlLF') is not available in this font Courier-Bold encoding: WinAnsiEncoding
    at org.apache.pdfBox@2.0.21/org.apache.pdfBox.pdmodel.font.PDType1Font.encode(PDType1Font.java:418)
    at org.apache.pdfBox@2.0.21/org.apache.pdfBox.pdmodel.font.PDFont.encode(PDFont.java:332)
    at org.apache.pdfBox@2.0.21/org.apache.pdfBox.pdmodel.PDPageContentStream.showtextInternal(PDPageContentStream.java:514)
    at org.apache.pdfBox@2.0.21/org.apache.pdfBox.pdmodel.PDPageContentStream.showtext(PDPageContentStream.java:476)
    at H2Test/org.Geek8080.Main.main(Main.java:69)

我在做什么错了?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)