生成pdf文件时间很长。

您好:

我是使用两个.dot模版合并成一份PDF文件,在文件中添加了一些图片,但是添加图片后花费的时间会很长,特别是 doc.save() 这个方法会占用很长时间。

我通过将图片转成html在添加到文件中,这样还是会占用很长时间, 怎么才能减少这个时间呢,我的图片是必须要添加的。
希望能得到你们的帮助,谢谢!
嗨,

感谢您的询问。 为确保及时准确的响应,请在此处附上以下资源进行测试:

  • 您输入的Word文档
  • Aspose.Words生成输出PDF文件
  • Word文档中使用的字体文件,例如 雅虎雅
  • 任何其他需要的资源文件(HTML,图像等)
  • 请创建一个独立的Android应用程序(没有编译错误的源代码),帮助我们重现您的具体问题,并将其附加在此进行测试。

一旦您准备好这些信息,我们将开始进一步调查您的问题,并为您提供更多信息。 谢谢你的合作。

PS:要附加这些资源,请压缩它们,然后单击“回复”按钮,将带您进入“回复页面”,底部您可以通过点击“添加/更新”按钮包含该帖子的任何附件。

最好的祝福,
This is my sample code,How can I shorten the time to generate pdf files?

public class MainActivity extends Activity {

private String sdCardPath = Environment.getExternalStorageDirectory().getPath() + File.separator;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.time).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

new Thread(new Runnable() {
@Override
public void run() {
if (creatMailMergeDocment()) {

Log.d("Mainactivity", "success");
long time = System.currentTimeMillis()/1000;
Log.d("Mainactivity","alltime "+time);
} else {
Log.d("Mainactivity","file");

}

}
}).start();
}
});
}


private boolean creatMailMergeDocment() {

try {

long time = System.currentTimeMillis()/1000;
Log.d("Mainactivity", "startTime " + time);
Document doc = new Document(sdCardPath + "template.dot");
Document docx = new Document(sdCardPath + "operation.dot");
doc.getMailMerge().execute(new MyMailMergeDataSource());
DocumentBuilder builder = new DocumentBuilder(doc);
DocumentBuilder builder1 = new DocumentBuilder(docx);
builder.moveToBookmark("pixTable");
Table table = builder.startTable();

for (int i = 0; i < 3; i++) {
builder.insertCell();
table.clearShading();
table.clearBorders();
table.autoFit(AutoFitBehavior.AUTO_FIT_TO_CONTENTS);
builder.insertImage(sdCardPath + "image.jpg", 180, 180);
}
builder.endRow();
for (int i = 0; i < 3; i++) {
builder.insertCell();
table.setAlignment(TableAlignment.CENTER);
table.clearShading();
table.clearBorders();
builder.getRowFormat().setAlignment(RowAlignment.CENTER);
table.setPreferredWidth(PreferredWidth.fromPercent(100));
builder.getCellFormat().setPreferredWidth(PreferredWidth.fromPercent(33));
builder.write("this is Deme" + i);
}
builder.endRow();
for (int i = 0; i < 3; i++) {
builder.insertCell();
table.setAlignment(TableAlignment.CENTER);
table.clearShading();
table.clearBorders();
table.autoFit(AutoFitBehavior.AUTO_FIT_TO_CONTENTS);
builder.insertImage(sdCardPath + "image.jpg",180,180);
}
builder.endRow();
builder.endTable();
builder1.moveToBookmark("fundusTable");
builder1.insertImage(sdCardPath + "image.jpg", 180, 180);
builder1.moveToBookmark("checkdoc");
builder1.insertImage(sdCardPath+ "signature.png");
builder1.moveToBookmark("pylorusTable");
builder1.insertHtml(getHtmlString());
doc.appendDocument(docx , ImportFormatMode.KEEP_SOURCE_FORMATTING);
FontSettings.getDefaultInstance().setFontsFolder(sdCardPath + "ttf/", true);
FontSettings.getDefaultInstance().setDefaultFontName("MS YaHei");

doc.save(sdCardPath + "MyMailDoc.pdf");
Log.d("Mainactivity", "AllTime " + time);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}

private String getHtmlString() {
StringBuilder builder = new StringBuilder();
builder.append("<div style=\" font-family:\"Hiragino Sans GB\", \"Microsoft YaHei UI\", " +
"\"Microsoft YaHei\", \"WenQuanYi Micro Hei\", sans-serif;\">");
builder.append("<table style=\"margin-left: 15px;width:100%; border:0px solid; font-size: 12pt;\">");
int columnCount = 3;
int rowCount = 4;
int columnWidthPercent = 100 / columnCount;
int cellWidth = (592 - 64 - 16 * columnCount + 1) / columnCount + 1;
for (int i = 0; i < rowCount; i++) {
builder.append("");
for (int j = 0; j < columnCount; j++) {
builder.append(String.format("<td style=\"width: %s; text-align: center;\">", columnWidthPercent + "%"));
String imageUrl = getOperationImageFile();
builder.append(String.format("<img style=\"width: %s;\" src=\"%s\" />", cellWidth, imageUrl));
builder.append("");
}
builder.append(" "
);
}
builder.append("");
builder.append("");
return builder.toString();
}
public String getOperationImageFile() {
File imageFile = new File(sdCardPath , "image.jpg");
return loadTemplateImageDataUriFromFile(imageFile);
}
/**
* ImageFile To Base64
* @param imageFile
* @return
*/
private String loadTemplateImageDataUriFromFile(File imageFile) {

try {
byte imageByes[] = IOUtilities.loadBytes(imageFile);
return convertImageToDataUri(imageByes);
} catch (IOException e) {
Log.e("MainActivity", "loadTemplateImageDataUriFromFile error: ", e);
}
return null;
}
/**
* creat Base64
* @param imageBytes
* @return
*/
public static String convertImageToDataUri(byte[] imageBytes) {

StringBuilder sb = new StringBuilder();
sb.append("data:image/png;base64,");
sb.append(Base64.encodeToString(imageBytes, Base64.DEFAULT));
return sb.toString();
}



class MyMailMergeDataSource implements IMailMergeDataSource {

int index = 0;
boolean once = true;

@Override
public String getTableName() throws Exception {
return null;
}

@Override
public boolean moveNext() throws Exception {
if (once) {
once = !once;
return true;
}
return false;
}

@Override
public boolean getValue(String s, Object[] objects) throws Exception {

if (TextUtils.equals(s, "title")) {
objects[0] = "安翰光电";
} else if (TextUtils.equals(s, "name")) {
objects[0] = "张三";
} else if (TextUtils.equals(s, "gender")) {
objects[0] = "";
} else if (TextUtils.equals(s, "age")) {
objects[0] = "26";
} else if (TextUtils.equals(s, "check_number")) {
objects[0] = "1008611";
} else if (TextUtils.equals(s, "capsule_id")) {
objects[0] = "1000011";
} else if (TextUtils.equals(s, "date")) {
objects[0] = "2017.17.14";
} else if (TextUtils.equals(s, "check_doctor")) {
objects[0] = "王武";
} else if (TextUtils.equals(s, "inspection_doctor")) {
objects[0] = "周熊";
} else if (TextUtils.equals(s, "main_doctor")) {
objects[0] = "田七";
} else if (TextUtils.equals(s, "address")) {
objects[0] = "条条大道通罗马";
} else if (TextUtils.equals(s, "phone_number")) {
objects[0] = "110112119";
} else if (TextUtils.equals(s, "diagnostic")) {
objects[0] = "吃的太多了,该减肥了";
} else if (TextUtils.equals(s, "result_check")) {
objects[0] = "太胖了";
} else if (TextUtils.equals(s, "suppose")) {
objects[0] = "多运动就好";
}
else if (TextUtils.equals(s, "signature")) {
Drawable drawable = getApplication().getResources().getDrawable(R.mipmap.ic_launcher);
objects[0] = drawable;
}

return true;
}

@Override
public IMailMergeDataSource getChildDataSource(String s) throws Exception {
return null;
}
}
嗨,

感谢您的询问。 请尝试为PdfSaveOptions类的“UpdateFields”选项指定false值,并将“opts”变量传递给Document.Save方法。

FontSettings.getDefaultInstance().setFontsFolder("D:/temp/operation/ttf/", true);
FontSettings.getDefaultInstance().setDefaultFontName("MS YaHei");

PdfSaveOptions opts =
new PdfSaveOptions();
opts.setUpdateFields(
false);

doc.save(sdCardPath +
"MyMailDoc.pdf", opts);

希望这可以帮助。

如果问题仍然存在,请ZIP并附上一个可运行的Android Studio应用程序(源代码无编译错误),以进一步测试。

在真正的Android设备上,您在最后观察的总时间是多少?

最好的祝福,

一共有两个zip文件,一个是Demo项目的源码,一份是需要的那些.dot文件。

嗨,

感谢您提供更多信息。

在通过Java授权版本的“Aspose.Words for Android通过Java”17.5进行初步测试后,我们无法再次重现此问题。 整个过程在五秒钟内结束。 但是,我们在生成的PDF中看到垃圾字符(见附件)。 这可能是因为缺少字体。 请ZIP并附加以下字体文件进行进一步测试

雅虎雅
宋体

最好的祝福,

你好,FontSettings.getDefaultInstance().setDefaultFontName() 这个方法在21.8版本中没有了,该用哪个方法替代呢?

@yifangcloud,

您现在可以使用以下代码指定默认字体:

FontSettings.getDefaultInstance().getSubstitutionSettings().getDefaultFontSubstitution().setDefaultFontName("Arial");

好的,找了好久没找到,非常感谢!

1 Like