我使用Android PDF Write(APW)来创建PDF,但它不适用于某些特殊字符(葡萄牙语)。
mypdf.addText(170, 50, 40,"Coração");
标准的含义是:
mypdf.setFont(StandardFonts.SUBTYPE, StandardFonts.COURIER, StandardFonts.WIN_ANSI_ENCODING);
outputToFile("helloworld.pdf",pdfcontent,"ISO-8859-1");
我试过了
outputToFile("helloworld.pdf",pdfcontent,"UTF-8");
outputToFile("helloworld.pdf",pdfcontent,"UTF-16");
outputToFile("helloworld.pdf",pdfcontent,"Cp1252");
并没有成功。 任何想法我该怎么办?
修改
方法outputToFile定义为:
private void outputToFile(String fileName, String pdfContent, String encoding) {
File newFile = new File(Environment.getExternalStorageDirectory() + "/" + fileName);
try {
newFile.createNewFile();
try {
FileOutputStream pdfFile = new FileOutputStream(newFile);
pdfFile.write(pdfContent.getBytes(encoding));
pdfFile.close();
} catch(FileNotFoundException e) {
//
}
} catch(IOException e) {
//
}
}
方法addText定义为:
public void addText(int leftPosition, int topPositionFromBottom, int fontSize, String text, String transformation) {
addContent(
"BT\n" +
transformation + " " + Integer.toString(leftPosition) + " " + Integer.toString(topPositionFromBottom) + " Tm\n" +
"/F" + Integer.toString(mPageFonts.size()) + " " + Integer.toString(fontSize) + " Tf\n" +
"(" + text + ") Tj\n" +
"ET\n"
);
}
此外,我将字体颜色更改为白色,添加以下rawcontent:
mypdf.addRawContent("1 1 1 rg\n");
然后我回到黑色字体颜色:
mypdf.addRawContent("0 0 0 rg\n");
答案 0 :(得分:4)
我获取了所有提供的信息,编写了以下简单的单元测试方法并运行它。
public void test19192108()
{
PDFWriter mPDFWriter = new PDFWriter(PaperSize.FOLIO_WIDTH, PaperSize.FOLIO_HEIGHT);
mPDFWriter.setFont(StandardFonts.SUBTYPE, StandardFonts.COURIER, StandardFonts.WIN_ANSI_ENCODING);
mPDFWriter.addText(170, 50, 40,"Coração");
String pdfcontent = mPDFWriter.asString();
outputToFile("helloworld19192108.pdf",pdfcontent,"ISO-8859-1");
}
(outputToFile
是来自APW PDFWriterDemo
类的辅助方法)
结果如下:
这似乎非常符合预期。
因此,无论哪种方式它都不适用于OP的某些特殊字符(葡萄牙语),因此重现该问题时缺少一些重要信息。
PS:根据开发环境的设置,源代码中可能存在非ASCII字符的问题。因此,替换
可能是个好主意 mPDFWriter.addText(170, 50, 40,"Coração");
与
mPDFWriter.addText(170, 50, 40,"Cora\u00e7\u00e3o");
PPS:查看生成的文件后,Adobe Reader想要修复它。原因是交叉引用表被破坏了。生成条目的代码是:
public void addObjectXRefInfo(int ByteOffset, int Generation, boolean InUse) {
StringBuilder sb = new StringBuilder();
sb.append(String.format("%010d", ByteOffset));
sb.append(" ");
sb.append(String.format("%05d", Generation));
if (InUse) {
sb.append(" n ");
} else {
sb.append(" f ");
}
sb.append("\r\n");
mList.add(sb.toString());
}
计算此条目中的字符,我们得到10 + 1 + 5 + 3 + 2 = 21。
根据规范,但是:
每个条目的长度应为20个字节,包括行尾标记
(来自第7.5.4节 ISO 32000-1的交叉引用表)
使用(当前版本)Android PDF Writer时,您也应修复此代码。