Печать разных значений (Количество копий) в разных копиях определенного документа

Мое приложение использует RTF file с полями слияния в качестве источника и создает PDF file с ним, используя Aspose.Words. Пользователи этого приложения передают полученный документ своим клиентам, поэтому копии одного и того же документа будут распечатаны для каждого из их клиентов. Однако в этих копиях есть только одно отличие: номер копии в конце каждой копии документа.

На данный момент; допустим, есть 4 клиента, поэтому 4 копии одного и того же документа будут напечатаны с разными номерами копий. Я достигаю этого, создавая один и тот же документ 4 раза, и каждый раз, когда я вставляю свой html-текст, объединяю поля и добавляю номер копии, а затем добавляю документы. В итоге у меня есть один большой документ, в который добавлены все 4 созданных документа.

Вот мой блок кода для него, там было много кода, поэтому я попытался уменьшить их до только связанных частей:

import com.aspose.words.*

Document docAllAppended = new Document(loadDocument("/documents/" + RTFFileName));
Document docTemp=null;
for (int i = 1; i <= copyNumber; i++) {
  docTemp = new Document(loadDocument("/documents/" + RTFFileName));

  DocumentBuilder builder = new DocumentBuilder(docTemp);
  //insert html which includes file context
  builder.insertHtml(htmlText);

  //insert Copy number
  builder.moveToBookmark("sayfa");
  Font font = builder.getFont();
  font.setBold(true);
  font.setSize(8);
  builder.write("Copy Number-" + i+ " / ");
  font.setBold(false);

  docAllAppended.appendDocument(docTemp,ImportFormatMode.USE_DESTINATION_STYLES);
}

Это выглядит так ненужно и имеет низкую производительность. Также каждый раз, когда мои пользователи пытаются изменить номер копии для печати, мое приложение вычисляет все с самого начала. Я спрашиваю, есть ли способ сделать это быстрее или как не создавать все это снова, когда изменяется номер копии для печати? Пока многого не нашел.

Заранее спасибо.


person halil    schedule 09.04.2015    source источник


Ответы (1)


Если единственное отличие — номер копии, то вы можете просто подготовить документ один раз, вставив HTML, объединив и т. д.

Затем в цикле for установите номер копии и сохраните документ как docx или pdf. Добавление документа в цикл не обязательно, вы можете сохранить каждую копию под другим именем.

import com.aspose.words.*

Document docAllAppended = new Document(loadDocument("/documents/" + RTFFileName));
Document docTemp=null;
docTemp = new Document(loadDocument("/documents/" + RTFFileName));

DocumentBuilder builder = new DocumentBuilder(docTemp);
//insert html which includes file context
builder.insertHtml(htmlText);

// In for loop, only update the copy number
for (int i = 1; i <= copyNumber; i++) {
    // Use DocumentBuilder for font setting
    builder.moveToBookmark("sayfa");
    Font font = builder.getFont();
    font.setBold(true);
    font.setSize(8);
    builder.write("dummy value");
    font.setBold(false);

    // Use Bookmark for setting the actual value
    Bookmark bookmark = docAllAppended.getRange().getBookmarks().get("sayfa");
    bookmark.setText("Copy Number-" + i + " / ");

    // Save the document for each client
    docAllAppended.save(Common.DATA_DIR + "Letter-Client-" + i + ".docx");
}

Я работаю с Aspose в качестве разработчика-евангелиста.

person Saqib Razzaq    schedule 10.04.2015
comment
Спасибо за ответ, с вашим решением мне нужно распечатать каждую копию отдельно за один вызов (сначала я пытался использовать макросы), что, я думаю, создаст другие проблемы. Каков наилучший способ мониторинга задействованных операций? Я использую профилировщик YourKit для мониторинга времени процессора, затрачиваемого на операции. Однако, когда была добавлена ​​подробная информация, такая как количество вызовов, время, затрачиваемое на операции aspose, резко увеличивается, как и на некоторые другие операции. 1 минута всего процесса превращается в 30 минут, поэтому я считаю это ненадежным. Есть ли более точный способ контроля за вовлеченными операциями. - person halil; 13.04.2015
comment
Это занимает столько времени без профилирования? Aspose.Words зависит от классов из платформы .NET и активно вызывает методы из библиотек классов .NET. Возможно, профилировщик также отслеживает вызовы из зависимостей и составляет огромный список. - person Saqib Razzaq; 14.04.2015
comment
Нет, без профилирования это занимает примерно 1 минуту (хотя это тоже довольно долго). Это, как вы сказали, делает профайлер. Используете ли вы какой-либо метод при выполнении операций, связанных с aspose, для отслеживания того, что происходит за кулисами. - person halil; 14.04.2015
comment
Обычно документы с изображениями большого размера или очень большим количеством страниц требуют времени для обработки. Детальный анализ может быть выполнен только нашими продуктовыми командами. Если вы считаете, что это занимает больше времени, разместите образец документа на форумах Aspose.Words по адресу aspose.com/community/forums/aspose.words-product-family/75/, служба поддержки свяжется с вами - person Saqib Razzaq; 14.04.2015