2017-06-22 106 views
0

我使用iText 5.1.2創建報告。 我有兩個PDF文檔。首先,我有我想把第二PDF文檔的全部內容的表格。每個頁面都是表格中的單獨單元格。將PDF文檔添加到表格

我目前的解決方案並不總是按預期工作。問題在於,對於某些PDF,當我將它們添加到表格中時,它們的頁面會旋轉90度。

這是我現在有:

//First document with table 
ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
Document pdfDocument = new Document(PageSize.A4, 60, 30, 120, 120); 
PdfWriter pdfWriter = PdfWriter.getInstance(pdfDocument, buffer); 
Rectangle pdfRectangle = pdfDocument.getPageSize(); 
pdfDocument.open(); 


PdfPTable table = new PdfPTable(1); 
table.setTotalWidth(pdfRectangle.getWidth() - pdfDocument.leftMargin() - pdfDocument.rightMargin()); 
table.setWidthPercentage(100); 
table.setSplitLate(false); 

pdfDocument.add(table); 

//other PDF document 
InputStream otherPdfStream = ... 
PdfReader pdfReader = new PdfReader(otherPdfStream); 

int numberOfPages = pdfReader.getNumberOfPages(); 
for (int pageNumber = 1; pageNumber <= numberOfPages; pageNumber++) { 
    PdfImportedPage pdfImportedPage = pdfWriter.getImportedPage(pdfReader, pageNumber); 
    Image image = Image.getInstance(pdfImportedPage); 
    table.addCell(image); 
} 

... 

pdfDocument.close(); 
pdfWriter.close(); 

我試圖用PdfCopy但現在我只拿到損壞的文件。

ByteArrayOutputStream atiStream = new ByteArrayOutputStream(); 
PdfDocument atiDocument = new PdfDocument(); 
PdfCopy copy = new PdfCopy(atiDocument, atiStream); 

... 

for (int pageNumber = 1; pageNumber <= numberOfPages; pageNumber++) { 
    PdfImportedPage pdfImportedPage = copy.getImportedPage(pdfReader, pageNumber); 
    Image image = Image.getInstance(pdfImportedPage); 
    table.addCell(image); 
} 
+0

您使用的iText版本日期爲2011年8月15日。爲什麼不升級到更新的版本?你的'PdfCopy'代碼不完整且令人困惑。你爲什麼要在'PdfCopy'的上下文中創建一個'table'? 'PdfCopy'用於合併文檔,而不是用表格創建文檔。頁面有一個維度(表示爲「矩形」和一個旋轉(表示爲90的倍數)。我沒有看到你在任何地方都將這個旋轉考慮在內。另外:你的問題在文檔中有描述。你看了嗎? –

+0

切換到新版本不是現在的選項,不幸的是,表格被添加到第一個文檔中,對不起,我錯過了代碼片段中的內容。我剛剛添加了_pdfDocument.add(table); _。用於合併文檔,但是我想要做的是在表格中插入一個pdf文檔的內容添加到其他pdf文檔。 –

+0

我認爲我們沒有很多客戶仍在使用iText 5.1.2。您確定你是一個客戶嗎?如果不是,你確定你的項目的背景允許使用iText免費嗎? –

回答

0

您正在描述的問題在chapter 6的第二個「iText in Action」一書中討論。

請參閱第6.2.1節,並查看圖6.1,您將看到兩個不同的文檔,每個文檔都包含一個帶有導入頁面的表格。

enter image description here

在PDF文件中的一個,進口的頁面在景觀;在另一個他們是在肖像。

有什麼區別?

那麼,一個PDF是用看起來或多或少像您的代碼創建的:ImportingPages1。在該代碼中,您不會考慮輪換。

其它PDF使用ImportingPages2創建:

PdfReader reader = new PdfReader(MovieTemplates.RESULT); 
int n = reader.getNumberOfPages(); 
PdfImportedPage page; 
PdfPTable table = new PdfPTable(2); 
for (int i = 1; i <= n; i++) { 
    page = writer.getImportedPage(reader, i); 
    table.getDefaultCell().setRotation(-page.getRotation()); 
    table.addCell(Image.getInstance(page)); 
} 
document.add(table); 

在這個例子中,我們改變細胞的旋轉,更具體地說,我們打開它,就像我們會回頭的時鐘。

更新:作爲替代page.getRotation(),您可以使用reader.getPageRotation(i)

+0

我想使用它,不幸的是我沒有在PdfImportedPage上使用_getRotation()_方法。有沒有辦法做到這一點與我使用的iText版本,或只有選項將升級到最新的? –

+0

我會更新我的答案,以便您可以接受它。 –

+0

謝謝!它有助於旋轉。 –