Я использую библиотеку pdfbox версии 2.0. Мне нужно открыть PDF в новой вкладке браузера, т.е. в режиме просмотра для печати.
Как будто мы переходим с iText на PDFBox ниже существующий код с iText.
В приведенном ниже коде есть класс PDFAction для достижения того же. Это,
PdfAction action = new PdfAction(PdfAction.PRINTDIALOG);
и применить Javascript для печати к документу,
copy.addJavaScript(action);
Мне нужно эквивалентное решение с PDFBox.
Document document = new Document();
try{
outputStream=response.getOutputStream();
// step 2
PdfCopy copy = new PdfCopy(document, outputStream);
// step 3
document.open();
// step 4
PdfReader reader;
int n;
//add print dialog in Pdf Action to open file for preview.
PdfAction action = new PdfAction(PdfAction.PRINTDIALOG);
// loop over the documents you want to concatenate
Iterator i=mergepdfFileList.iterator();
while(i.hasNext()){
File f =new File((String)i.next());
is=new FileInputStream(f);
reader=new PdfReader(is);
n = reader.getNumberOfPages();
for (int page = 0; page < n; ) {
copy.addPage(copy.getImportedPage(reader, ++page));
}
copy.freeReader(reader);
reader.close();
is.close();
}
copy.addJavaScript(action);
// step 5
document.close();
}catch(IOException io){
throw io;
}catch(DocumentException e){
throw e;
}catch(Exception e){
throw e;
}finally{
outputStream.close();
}
Я также пытался использовать приведенную ниже ссылку, но не смог найти метод print()
типа PDDocument.
Пожалуйста, помогите мне с этим.
Вот как выглядит файл при отображении во вкладке браузера:
@TilmanHausherr Добавлен рассматриваемый просмотр файла. Кроме того, это ссылка на этот файл: drive.google.com/file/d/1UShCgqx1Kyx40C7v9ehU-KdMFnYxlKWn/…
Да, мне нужен сам файл. На снимке экрана нет поля «печать», поэтому мне интересно, неправильно ли я понял вопрос.
В качестве отступления: в вашем коде, связанном с iText, вы используете PdfCopy
, где PdfStamper
создал бы более точный результат с меньшими затратами.
Этот код воспроизводит то, что есть в вашем файле, действие JavaScript в дереве имен в записи JavaScript в словаре имен в каталоге документов. («Когда документ открыт, все действия в этом дереве имен должны выполняться, определяя функции JavaScript для использования другими скриптами в документе» — Спецификация PDF ) Вероятно, есть более простой способ сделать это, например. с OpenAction.
PDActionJavaScript javascript = new PDActionJavaScript("this.print(true);\n");
PDDocumentCatalog documentCatalog = document.getDocumentCatalog();
PDDocumentNameDictionary names = new PDDocumentNameDictionary(documentCatalog, new COSDictionary());
PDJavascriptNameTreeNode javascriptNameTreeNode = new PDJavascriptNameTreeNode();
Map<String, PDActionJavaScript> map = new HashMap<>();
map.put("0000000000000000", javascript);
javascriptNameTreeNode.setNames(map);
names.setJavascript(javascriptNameTreeNode);
document.getDocumentCatalog().setNames(names);
Спасибо @Tilman Hausherr. Это помогло мне.
Можете ли вы поделиться результатом в формате PDF, полученным с помощью itext?