簡體   English   中英

如何從 itext7 中的現有 PdfDocument 打開 PdfADocument?

[英]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 感到非常困惑。

您的方法對PdfDocumentPdfADocument實例使用相同的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM