如何解决;U+没有标志符号;字体为“Helvetica粗体”的000A;在pdfbox中(android端口)
我想把一些文字写成pdf格式。我在“ICRROUTTXT”中有数据。在尝试写入pdf之前,我还将数据写入文件。当我尝试写入pdf时,我得到“没有字体为Helvetica Bold的U+000A字形”。如何解决?我不喜欢“Helvetica Bold”。我愿意换成任何字体如何解决;U+没有标志符号;字体为“Helvetica粗体”的000A;在pdfbox中(android端口),android,pdfbox,Android,Pdfbox,我想把一些文字写成pdf格式。我在“ICRROUTTXT”中有数据。在尝试写入pdf之前,我还将数据写入文件。当我尝试写入pdf时,我得到“没有字体为Helvetica Bold的U+000A字形”。如何解决?我不喜欢“Helvetica Bold”。我愿意换成任何字体 @Override protected Boolean doInBackground(Void... params) { Boolean ret = f
@Override
protected Boolean doInBackground(Void... params) {
Boolean ret = false;
PDDocument document = new PDDocument();
try {
float scale = 0.8f; // alter this value to set the image size
formPreference = getSharedPreferences(SHARD_PREFERENCES,
MODE_PRIVATE);
PDPage page = new PDPage();
document.addPage(page);
PDPageContentStream contentStream = new PDPageContentStream(
document, page, false, true);
PDFont pdfFont = PDType1Font.HELVETICA_BOLD;
float fontSize = 25;
float leading = 1.5f * fontSize;
PDRectangle mediabox = page.getMediaBox();
float margin = 72;
float width = mediabox.getWidth() - 2 * margin;
float startX = mediabox.getLowerLeftX() + margin;
float startY = mediabox.getUpperRightY() - margin;
// icrResultTxt;//
writeToFile(icrResultTxt);
String text = icrResultTxt; // "I am trying to create a PDF file with a lot of text contents in the document. I am using PDFBox";
List<String> lines = new ArrayList<String>();
int lastSpace = -1;
while (text.length() > 0) {
int spaceIndex = text.indexOf(' ', lastSpace + 1);
if (spaceIndex < 0) {
lines.add(text);
text = "";
} else {
String subString = text.substring(0, spaceIndex);
float size = fontSize
* pdfFont.getStringWidth(subString) / 1000;
if (size > width) {
if (lastSpace < 0) // So we have a word longer than
// the line... draw it anyways
lastSpace = spaceIndex;
subString = text.substring(0, lastSpace);
lines.add(subString);
text = text.substring(lastSpace).trim();
lastSpace = -1;
} else {
lastSpace = spaceIndex;
}
}
}
contentStream.beginText();
contentStream.setFont(pdfFont, fontSize);
contentStream.moveTextPositionByAmount(startX, startY);
for (String line : lines) {
contentStream.drawString(line);
contentStream.moveTextPositionByAmount(0, -leading);
}
contentStream.endText();
contentStream.close();
File fz = new File(
Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
+ File.separator + "hello.pdf");
if (!fz.exists()) {
fz.createNewFile();
} else {
fz.delete();
fz.createNewFile();
}
document.save(fz);
} catch (Exception e) {
Log.v("mango", e.getMessage());
}
private void writeToFile(String data) {
try {
File d = GetImageFile("test.txt");
if (d.exists()) {
d.delete();
d.createNewFile();
} else {
d.createNewFile();
}
FileOutputStream stream = new FileOutputStream(d);
try {
stream.write(data.getBytes());
} finally {
stream.close();
}
} catch (IOException e) {
Log.e("Exception", "File write failed: " + e.toString());
}
}
@覆盖
受保护的布尔doInBackground(Void…params){
布尔ret=false;
PDDocument文档=新PDDocument();
试一试{
浮动比例=0.8f;//更改此值以设置图像大小
formPreference=getSharedPreferences(共享首选项,
模式(私人),;
PDPage page=新PDPage();
文件。添加页(第页);
PDPageContentStream contentStream=新的PDPageContentStream(
文件,页,假,真);
PDFont pdfFont=PDType1Font.HELVETICA_粗体;
浮点数=25;
浮动前导=1.5f*fontSize;
PDRectangle mediabox=page.getMediaBox();
浮动保证金=72;
float width=mediabox.getWidth()-2*边距;
float startX=mediabox.getLowerLeftX()+边距;
float startY=mediabox.getUpperRightY()-边距;
//icrResultText//
writeToFile(ICResultText);
String text=icrResultText;//“我正在尝试创建一个包含文档中大量文本内容的PDF文件。我正在使用PDFBox”;
列表行=新的ArrayList();
int lastSpace=-1;
while(text.length()>0){
int spaceIndex=text.indexOf(“”,lastSpace+1);
if(spaceIndex<0){
行。添加(文本);
text=“”;
}否则{
String subString=text.subString(0,spaceIndex);
浮动大小=字体大小
*Pdfont.getStringWidth(子字符串)/1000;
如果(尺寸>宽度){
if(lastSpace<0)//所以我们有一个比
//这条线…无论如何画出来
lastSpace=spaceIndex;
subString=text.subString(0,lastSpace);
行。添加(子字符串);
text=text.substring(lastSpace.trim();
lastSpace=-1;
}否则{
lastSpace=spaceIndex;
}
}
}
contentStream.beginText();
setFont(pdfFont,fontSize);
contentStream.moveTextPositionByAmount(startX,startY);
用于(字符串行:行){
contentStream.抽绳(线);
contentStream.moveTextPositionByAmount(0,-前导);
}
contentStream.endText();
contentStream.close();
文件fz=新文件(
环境
.getExternalStoragePublicDirectory(Environment.DIRECTORY\u图片)
+File.separator+“hello.pdf”);
如果(!fz.exists()){
fz.createNewFile();
}否则{
fz.delete();
fz.createNewFile();
}
文件保存(fz);
}捕获(例外e){
Log.v(“mango”,e.getMessage());
}
私有void writeToFile(字符串数据){
试一试{
文件d=GetImageFile(“test.txt”);
如果(d.存在()){
d、 删除();
d、 createNewFile();
}否则{
d、 createNewFile();
}
FileOutputStream=新的FileOutputStream(d);
试一试{
stream.write(data.getBytes());
}最后{
stream.close();
}
}捕获(IOE异常){
Log.e(“异常”,“文件写入失败:”+e.toString());
}
}
请使用以下代码“\r\n”
不要使用字体中不支持的代码。U+000A不是字形,而是换行符。请删除它。我正在从Abbyy Mobile Ocr SDK获取字符串。我无法删除任何内容:(,你能给我推荐任何其他不会有换行符问题的字体吗?你能添加自定义字体吗?包含你需要的大多数字母表。它们都会有问题,因为换行符不是字形。换行符意味着你应该开始一行。你应该做的是修复程序的其余部分,分割得到的内容并开始一行在PDF中。或者这样做:line=line.replaceAll(“\r\n”,“?”),你会得到“?”而不是LF/CRs。这当然看起来很奇怪,也没有意义。按照规定,我做了:line=replaceAll(“[\\t\\n\\r]”,“…”);但是现在得到的是“这种字体类型只支持8位代码点”。怎么办?
contentStream.moveTextPositionByAmount(100, 700);
contentStream.drawString("hello");
contentStream.endText();
contentStream.beginText();
contentStream.moveTextPositionByAmount(100, 690);//the second parameter mast between 800.0 and 0.0