java - 为什么我不能用 iText 垂直打印这个字符串?

标签 java pdf pdf-generation itext

我没有使用 iText 的丰富经验,我遇到以下问题。

我必须将一个Phrase(一个简单的字符串,我认为在我的情况下也可以是一个Chunk)垂直放置到一个页面中。

所以我遵循了官方 iText 文档中的教程:http://itextpdf.com/examples/iia.php?id=202

这是我的代码:

private static void printPdf() {

    /** The resulting PDF file: */
    String result = "D:/MYCOMPANY/massive_pdf_print.pdf";

    // STEP 1 Creazione del documento in formato A4 e senza margini:
    com.itextpdf.text.Document document = new com.itextpdf.text.Document(com.itextpdf.text.PageSize.A4, 0, 0, 0, 0);

    try {
        /* STEP 2 Constructs a PdfWriter.
                  document: The PdfDocument that has to be written.
                  os: The OutputStream the writer has to write to
         */
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(result));

        // STEP 3:
        document.open();

        // STEP 4:
        //document.add(new Paragraph("Hello World!"));

        VerticalText vt = new VerticalText(writer.getDirectContent());

        vt.addText(new Phrase("Hello World !!!"));
        vt.go();

        // STEP 5:
        document.close();

    }catch (DocumentException ex){
        ex.printStackTrace();
    }
    catch (IOException ex){
        ex.printStackTrace();
    }

}

好的,问题是当尝试执行这一行时:

document.close();

抛出以下异常:

Exception in thread "main" ExceptionConverter: java.io.IOException: The document has no pages.
    at com.itextpdf.text.pdf.PdfPages.writePageTree(PdfPages.java:113)
    at com.itextpdf.text.pdf.PdfWriter.close(PdfWriter.java:1217)
    at com.itextpdf.text.pdf.PdfDocument.close(PdfDocument.java:777)
    at com.itextpdf.text.Document.close(Document.java:398)
    at mainPkg.Main.printPdf(Main.java:123)
    at mainPkg.Main.main(Main.java:78)

Process finished with exit code 1

为什么?我错过了什么?我怎样才能解决这个问题并垂直打印我的“Hello World !!!”字符串?

编辑 1:

这是我在修改代码插入后看到生成的 PDF 的方式:

vt.setVerticalLayout(390, 570, 540, 12, 30);

enter image description here

如您所见,文本不是垂直对齐的,而是带有边距的水平对齐。为什么?我错过了什么?

谢谢

最佳答案

您没有定义任何维度。

在您引用的我的书中的示例中,有这一行:

vt.setVerticalLayout(390, 570, 540, 12, 30);

这些坐标定义了垂直列的位置,参见 setVerticalLayout()方法:

  • startX - 右上角X线位置
  • startY - 右上Y线位置
  • height - 线条的高度
  • maxLines - 最大行数
  • leading - 行与行之间的分隔

由于您没有定义这些值,iText 不知道在哪里添加文本,因此没有添加文本并且“文档没有页面”。

更新:

虽然最初的问题得到了充分的回答,但没有被接受。相反,问题被改变了。这在 StackOverflow 上是不正确的行为:应该发布一个新问题。

此外,原始问题和改编后的两个问题都证明缺乏对文档的尊重。一个例子取 self 的书,然后那个例子被肢解了,然后我被问到:为什么这行不通。

第一个残缺包括删除一个基本行。第二个破坏表明为支持该示例而编写的文档被忽略了。

在书写竖排文字时,需要使用特定的编码方式:Identity-V。如书中所述,Identity-H 适用于水平书写系统,而 Identity-V 适用于垂直书写系统。您正在使用水平书写的编码,期望它垂直书写文本...

如何解决这个问题?通过使用 Identity-V,如 VTExample 中所示:

public void createPdf(String dest) throws IOException, DocumentException {
    Document document = new Document();
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
    document.open();
    BaseFont bf = BaseFont.createFont(
        FONT, BaseFont.IDENTITY_V, BaseFont.NOT_EMBEDDED);
    Font font = new Font(bf, 20);
    VerticalText vt = new VerticalText(writer.getDirectContent());
    vt.setVerticalLayout(559, 806, 770, 29, 18);
    vt.addText(new Phrase("Hello World !!!", font));
    vt.go();
    document.close();
}

重要的参数是BaseFont.IDENTITY_V。请注意,此参数不能与每种字体结合使用。例如:它不适用于 Helvetica。在我的示例中,我使用了 FreeSans:

enter image description here

关于java - 为什么我不能用 iText 垂直打印这个字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28564434/

相关文章:

qt - 如何将 QQuickView 的内容打印为 PDF?

java - 如何使用 Selenium webdriver 找到具有相同 CSS 类的第二个值

java - 客户端-服务器应用程序套接字问题

java - 提取带标签的 PDF 中的阅读顺序序列

pdf-generation - 将 Open XML 保存为 PDF

asp.net - 如何将 Acrobat XML 表单转换为 "real"PDF

java - 使用内存将文件添加到 zip java,同时避免保留文件名问题

java - 将毫秒转换为年数、月数和天数的最佳方法

c# - 报表查看器控件将内容导出为 pdf

php - 使用 PHP 创建 PDF 文件