为什么我不能用 iText 垂直打印这个字符串?
Why I can't vertically print this String with 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);
如您所见,文本没有垂直对齐,而是水平对齐并带有边距。为什么?我错过了什么?
Tnx
您没有定义任何维度。
在您引用的我的书中的示例中,有这一行:
vt.setVerticalLayout(390, 570, 540, 12, 30);
这些坐标定义了垂直列的位置,参见setVerticalLayout()
方法:
- startX - 右上角X线位置
- startY - 右上Y线位置
- height - 线条的高度
- maxLines - 最大行数
- leading - 行与行之间的间隔
由于您没有定义这些值,iText 不知道在哪里添加文本,因此没有添加文本并且 "the document has no pages."
更新:
原题虽然回答的很充分,但是没有被采纳。相反,问题被改变了。这在 Whosebug 上是不正确的行为:应该发布一个新问题。
此外,原始问题和改编后的两个问题都证明缺乏对文档的尊重。从我的书中拿了一个例子,然后那个例子被肢解了,然后我被问到:为什么这行不通。
第一次肢解包括删除一条重要的线。第二个残缺显示为支持该示例而编写的文档被忽略了。
写竖排文字时,需要使用特定的编码: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:
我没有使用 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
您没有定义任何维度。
在您引用的我的书中的示例中,有这一行:
vt.setVerticalLayout(390, 570, 540, 12, 30);
这些坐标定义了垂直列的位置,参见setVerticalLayout()
方法:
- startX - 右上角X线位置
- startY - 右上Y线位置
- height - 线条的高度
- maxLines - 最大行数
- leading - 行与行之间的间隔
由于您没有定义这些值,iText 不知道在哪里添加文本,因此没有添加文本并且 "the document has no pages."
更新:
原题虽然回答的很充分,但是没有被采纳。相反,问题被改变了。这在 Whosebug 上是不正确的行为:应该发布一个新问题。
此外,原始问题和改编后的两个问题都证明缺乏对文档的尊重。从我的书中拿了一个例子,然后那个例子被肢解了,然后我被问到:为什么这行不通。
第一次肢解包括删除一条重要的线。第二个残缺显示为支持该示例而编写的文档被忽略了。
写竖排文字时,需要使用特定的编码: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: