![](/img/trans.png)
[英]How do I copy pages from one PdfDocument to another with itext7
[英]How to open a PdfADocument from an existing PdfDocument in itext7?
為了檢查上傳的 PDF 文件是否符合基本的 PDF/A,我需要將它們作為 PdfADocuments 閱讀。 但是從 7.1.6 版開始,這不再有效,而是拋出 PdfException(PdfException.PdfReaderHasBeenAlreadyUtilized)
class Controller
...
// get uploaded data into PdfDocument, which is passed
// on to different services.
InputStream filecontent = fileupload.getInputStream();
int read = 0;
byte[] bytes = new byte[1024];
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
while ((read = filecontent.read(bytes,0,bytes.length)) != -1) {
filesize += read;
buffer.write(bytes, 0, read);
}
ByteArrayInputStream input = new ByteArrayInputStream(buffer.toByteArray());
PdfReader reader = new PdfReader(input);
PdfWriter writer = new PdfWriter(new ByteArrayOutputStream());
PdfDocument pdf = new PdfDocument(reader, writer);
AnalyzerService analyzer = new AnalyzerService();
if(analyzer.analyze(pdf)) {
otherService.doSomethingWith(pdf);
}
...
class AnalyzerService
...
public boolean analyze(PdfDocument pdf) {
PdfADocument pdfa = new PdfADocument(
pdf.getReader(), pdf.getWriter() <-- PdfException here
);
...
}
直到並包括 iText 7.1.5 這都有效。
在 7.1.6 中,我得到“com.itextpdf.kernel.PdfException:鑒於 PdfReader 實例已被使用。PdfReader 無法重用,請創建一個新實例。”
似乎我需要從 PdfDocument 中獲取字節作為字節 [],然后從中創建一個新的 PdfReader。 我曾嘗試從 pdf.getReader().getOutputStream().toByteArray() 獲取它們,但這不起作用。
目前我對如何從給定的 PdfDocument 創建該 PdfADocument 感到非常困惑。
您的方法對PdfDocument
和PdfADocument
實例使用相同的PdfReader
和(甚至更糟)相同的PdfWriter
。 由於兩者都可以操縱PdfReader
並寫入PdfWriter
,因此這種情況很可能會在寫入器中造成垃圾,因此您不應這樣做。
只需始終將同時具有閱讀者和作者的文檔視為正在進行中的文檔,而有些文檔則不能視為完成的文檔文件,例如用於中間檢查的摘錄。
當你要檢查上載的PDF文件 ,你為什么不干脆向前byte[]
從buffer.toByteArray()
的analyze
,從方法創建一個單獨的閱讀器(如果需要的話,一個文件)? 這確實會檢查上傳的文件...
此外,如果您輸入的文件可能是PDF / A PdfADocument
,並且在這種情況下經過特殊處理,那么您是否也應該將其作為PdfADocument
處理呢? 也就是說,您不應該首先檢查分析儀是否符合要求,在肯定的情況下,在控制器類中也要使用PdfADocument
?
PdfDocument SourcePDF=null;
PdfADocument DisPDF =null;
try
{
PdfReader Reader = new PdfReader(input-Path);
PdfWriter writer = new PdfWriter(output-Path, new WriterProperties().SetPdfVersion(PdfVersion.PDF_2_0));
writer.SetSmartMode(true);
SourcePDF = new PdfDocument(Reader);
DisPDF = new PdfADocument(writer, PdfAConformanceLevel.PDF_A_3A,
new PdfOutputIntent("Custom", "", "https://www.color.org", "sRGB", new MemoryStream(Properties.Resources.sRGB_CS_profiles)));
DisPDF.InitializeOutlines();
//Setting some required parameters
DisPDF.SetTagged();
DisPDF.GetCatalog().SetLang(new PdfString("en-EN"));
DisPDF.GetCatalog().SetViewerPreferences(new PdfViewerPreferences().SetDisplayDocTitle(true));
PdfMerger merger = new PdfMerger(DisPDF, true, true);
merger.Merge(SourcePDF, 1, sorsePDF.GetNumberOfPages());
SourcePDF.Close();
DisPDF.Close();
}
catch (Exception ex)
{
throw;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.