我是PDFBox(和PDF生成)的新手,我很难生成自己的PDF.
我确实有一些以英寸/厘米为单位坐标的文本,我需要将它们转换为PDFBox使用的单位.任何建议/实用程序都可以自动执行此操作?
PDPageContentStream.moveTextPositionByAmount(x,y) 对我毫无意义.
我正在使用PDFBox,以下代码:
doc = new PDDocument();
page = new PDPage();
doc.addPage(page);
PDFont font = PDType1Font.COURIER;
pdftitle = new PDPageContentStream(doc, page);
pdftitle.beginText();
pdftitle.setFont( font, 12 );
pdftitle.moveTextPositionByAmount( 40, 740 );
pdftitle.drawString("Here I insert a lot of text");
pdftitle.endText();
pdftitle.close();
Run Code Online (Sandbox Code Playgroud)
有谁知道如何包装文本,以便它自动转到另一行?非常感谢!
PDFBOX API中是否有任何函数可以使文本合理,或者我们必须手动执行?如果手动然后如何使用java(其背后的逻辑)证明文本
当我尝试将非法字符写入PDF时,我显然会遇到异常.例如
contentStream.showText("some illegal characters");
...
java.lang.IllegalArgumentException: U+000A ('controlLF') is not available in this font Helvetica (generic: ArialMT) encoding: WinAnsiEncoding...
Run Code Online (Sandbox Code Playgroud)
如何找出不支持哪些字符并从字符串中删除它们?
我正在编写一个Java函数,该函数将String作为参数,并使用PDFBox产生PDF作为输出。
只要我使用拉丁字符,一切都可以正常工作。但是,我事先不知道输入什么,可能是英文,中文或日文字符。
在非拉丁字符的情况下,这是我得到的错误:
Exception in thread "main" java.lang.IllegalArgumentException: U+3053 ('kohiragana') is not available in this font Helvetica encoding: WinAnsiEncoding
at org.apache.pdfbox.pdmodel.font.PDType1Font.encode(PDType1Font.java:426)
at org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:324)
at org.apache.pdfbox.pdmodel.PDPageContentStream.showTextInternal(PDPageContentStream.java:509)
at org.apache.pdfbox.pdmodel.PDPageContentStream.showText(PDPageContentStream.java:471)
at com.mylib.pdf.PDFBuilder.generatePdfFromString(PDFBuilder.java:122)
at com.mylib.pdf.PDFBuilder.main(PDFBuilder.java:111)
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,则必须对日语使用一种特定的字体,对中文使用另一种字体,依此类推,因为我使用的(Helvetiva)字体不能处理所有必需的unicode字符。
我还可以使用处理所有这些unicode字符的字体,例如Arial Unicode。但是,该字体受特定许可使用,因此我无法使用它,也没有找到另一种。
我找到了一些想要解决此问题的项目,例如Google NOTO项目。但是,该项目提供了多个字体文件。因此,我将不得不在运行时根据我的输入选择要加载的正确文件。
因此,我面临两个选择,其中一个我不知道如何正确实现:
一直在寻找可以处理几乎所有unicode字符的字体(我急切地希望在哪里找到这个字体?
尝试检测使用哪种语言,然后根据需要选择一种字体。尽管我还不知道该怎么做,但我仍然认为它不是一个干净的实现,因为输入和字体文件之间的映射将被硬编码,这意味着我将必须对所有硬编码可能的映射。
还有其他解决方案吗?
我完全偏离轨道了吗?
在此先感谢您的帮助和指导!
这是我用来生成PDF的代码:
public static void main(String args[]) throws IOException {
String latinText = "This is latin text";
String japaneseText = "????????";
// This works good
generatePdfFromString(latinText);
// …Run Code Online (Sandbox Code Playgroud) 我想用PDFBox在我的PDF中写一些内容.一旦页面高度小于我需要创建另一页面的边距.我想保留游标信息.我有一种方法可以获取光标信息,例如光标所在的位置,这样我就可以从光标位置减去边距并为其添加另一个页面.现在我做了类似的事
PDRectangle rect = page.getMediaBox();
float positionY = rect.getWidth();
positionY = positionY - pdfWriter.defaultBottomMargin;
if(positionY < positionX) {
positionY = rect.getWidth();
PDPage page2 = page;
rect = page2.getMediaBox();
document.addPage(page2);
PDPageContentStream contentStream = new PDPageContentStream(document, page2);
contentStream.appendRawCommands("T*\n");
contentStream.beginText();
// contentStream.setFont(font, 12);
contentStream.moveTextPositionByAmount(positionX, positionY);
contentStream.drawString(tmpText[k]);
contentStream.endText();
contentStream.close();
}
Run Code Online (Sandbox Code Playgroud)