我正在使用PDFBox和iText来创建各种语言的简单(仅段落)pdf文档。类似的东西:
PDFBOX :
private static void createPdfBoxDocument(File from, File to) {
PDDocument document = null;
try {
document = new TextToPDF().createPDFFromText(new FileReader(from));
document.save(new FileOutputStream(to));
} finally {
if (document != null)
document.close();
}
}
private void createPdfBoxDoc() throws IOException, FileNotFoundException, COSVisitorException {
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
PDType1Font font = PDType1Font.TIMES_ROMAN;
contentStream.setFont(font, 12);
contentStream.beginText();
contentStream.moveTextPositionByAmount(100, 400);
contentStream.drawString("š");
contentStream.endText();
contentStream.close();
document.save("test.pdf");
document.close();
}
iText的:
private static Font blackFont = new Font(Font.FontFamily.COURIER, 12, Font.NORMAL, BaseColor.BLACK);
private static void createITextDocument(File from, File to) {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(to));
document.open();
addContent(document, getParagraphs(from));
document.close();
}
private static void addContent(Document document, List<String> paragraphs) {
for (int i = 0; i < paragraphs.size(); i++) {
document.add(new Paragraph(paragraphs.get(i), blackFont));
}
}
输入文件以UTF-8编码,并且某些Unicode字符集的语言(如俄语字母等)在pdf中无法正确呈现。两个库中的字体不支持我认为的Unicode字符集,我找不到有关如何添加和使用第三方字体的任何文档。可以请任何人帮我一个例子吗?
答案 0 :(得分:5)
如果您使用的是iText,它会得到很好的支持。
在iText in Action(第2.2.2章)中,您可以阅读更多内容。
你必须下载一些像 arialuni.ttf 这样的unicode字体并按照以下方式执行:
public static File fontFile = new File("fonts/arialuni.ttf");
public static void createITextDocument(File from, File to) throws DocumentException, IOException {
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(to));
document.open();
writer.getAcroForm().setNeedAppearances(true);
BaseFont unicode = BaseFont.createFont(fontFile.getAbsolutePath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
FontSelector fs = new FontSelector();
fs.addFont(new Font(unicode));
addContent(document, getParagraphs(from), fs);
document.close();
}
private static void addContent(Document document, List<String> paragraphs, FontSelector fs) throws DocumentException {
for (int i = 0; i < paragraphs.size(); i++) {
Phrase phrase = fs.process(paragraphs.get(i));
document.add(new Paragraph(phrase));
}
}
arialuni.ttf字体对我有用,到目前为止我检查了它对
的支持BG, ES, CS, DA, DE, ET, EL, EN, FR, IT, LV, LT, HU, MT, NL, PL, PT, RO, SK, SL, FI, SV
并且只有罗马尼亚语的PDF版本没有正确创建...
使用 PDFBox ,它几乎相同:
private void createPdfBoxDoc() throws IOException, FileNotFoundException, COSVisitorException {
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
PDFont font = PDTrueTypeFont.loadTTF(document, "fonts/arialuni.ttf");
contentStream.setFont(font, 12);
contentStream.beginText();
contentStream.moveTextPositionByAmount(100, 400);
contentStream.drawString("š");
contentStream.endText();
contentStream.close();
document.save("test.pdf");
document.close();
}
然而正如Gagravarr所说,由于这个问题PDFBOX-903,它不起作用。即使有1.6.0-SNAPSHOT版本。也许干线会起作用。我建议你使用iText。它完美地运作在那里。
答案 1 :(得分:1)
您可能会发现this answer有用 - 它确认您无法使用其中一种标准类型1字体执行操作,因为它们只是Latin1
理论上,您只需要embed a suitable font进入处理所有代码点的文档,然后使用它。但是,至少有one open bug编写unicode字符串,所以有可能它还没有工作......尝试从svn trunk获取最新的pdfbox,但看看它是否有帮助!
答案 2 :(得分:0)
在我的项目中,我只是将支持UTF8(或任何你想要的语言)的字体复制到目录(或者你可以使用Windows字体路径)并添加一些代码,它看起来像这样
BaseFont baseFont = BaseFont.createFont("c:\\a.ttf", BaseFont.IDENTITY_H,true);
Font font = new Font(baseFont);
document.add(new Paragraph("Not English Text",font));
现在,您可以使用此字体以各种语言显示文字。
答案 3 :(得分:0)
//使用此代码。有时setfont()不适用于段落
try
{
FileOutputStream out=new FileOutputStream(name);
Document doc=new Document();
PdfWriter.getInstance(doc, out);
doc.open();
Font f=new Font(FontFamily.TIMES_ROMAN,50.0f,Font.UNDERLINE,BaseColor.RED);
Paragraph p=new Paragraph("New PdF",f);
p.setAlignment(Paragraph.ALIGN_CENTER);
doc.add(p);
doc.close();
}
catch(Exception e)
{
System.out.println(e);
}
}