【问题标题】:Why I can't vertically print this String with iText?为什么我不能用 iText 垂直打印这个字符串?
【发布时间】:2015-02-17 15:03:14
【问题描述】:

我没有使用 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);

如您所见,文本未垂直对齐,但似乎与边距水平对齐。为什么?我错过了什么?

Tnx

【问题讨论】:

    标签: java pdf pdf-generation itext


    【解决方案1】:

    您没有定义任何维度。

    在你提到的我书中的例子中,有这样一行:

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

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

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

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

    更新:

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

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

    第一次切割包括删除一条基本线。第二个残缺表明为支持该示例而编写的文档被忽略了。

    在书写竖排文本时,需要使用特定的编码: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:

    【讨论】:

    • 我尝试按照您在帖子中的解释进行操作,但我不知道我的文字是垂直的。我已经编辑了我的原始帖子,显示了我的结果。我错过了什么?
    • 很抱歉,但每当我看到您的名字时,我都会感到沮丧,因为您对我编写的文档表现出很少的尊重。你不会把我当作开发人员,而是作为一个“复制/粘贴”的人来复制和粘贴 工作代码 的 sn-ps,破坏原始示例然后抱怨 它没有'不起作用。 为什么它不起作用?因为您滥用示例!当我谈到您对文档缺乏尊重时,我会回答您的问题以表明我的意思。
    • 也许我可能误解了您的在线示例,并且可能我没有意识到我对原始问题的编辑可能是一个新答案,但您假设所有人都读过您的书。不幸的是我没有你的书,今天他们让我用 iText 做这些事情,我只有在线文档,没有 iText 不是我一生都在使用的那种东西……我用了两次在我生命中。似乎您以一种非常个人化的方式来看待它,并且不会冒犯那些根本不每天使用 iText 的人
    • 谁让你用 iText 做这些事情的?他们在什么情况下使用 iText?他们有商业执照吗?如果他们有商业许可证(他们应该),他们可以在问题跟踪器上为付费客户发布问题。在这种情况下,他们会得到一个专业的答案。如果他们没有许可证,他们只能获得个人的答案。您似乎将 专业 与 个人 混淆了。如果你只是一个用户,而不是客户,你就会变得个性化。
    猜你喜欢
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    相关资源
    最近更新 更多