如何将所有内容从 PDF 页面复制到 PDF 页面?
How to copy everything from PDF page to PDF page?
我有几个 PDF 的页面大小不正常,略小于 8.5x11。这些页面需要是 8.5x11 的,其内容居中并且没有调整大小。这可以通过以实际尺寸和方向设置为自动在 8.5x11 纸张上打印页面,然后重新扫描打印页面来实现,但这会浪费时间和纸张,并且可能会降低质量。经过大量谷歌搜索和搜索 https://api.itextpdf.com/,我在 C# 中使用 iText 7.1.14 想到了这个:
public void FixSize() // method in PDFentry class
{
// FQFName is the string property Fully Qualified File Name
PdfDocument srceDoc = new PdfDocument(new PdfReader(FQFName));
int pageCount = srceDoc.GetNumberOfPages();
string tempFile = Path.GetTempFileName();
PdfDocument destDoc = new PdfDocument(new PdfWriter(tempFile));
iText.Kernel.Geom.PageSize newPageSize = iText.Kernel.Geom.PageSize.LETTER;
// this is in a try/catch, removed here for brevity
for (int page = 1; page <= pageCount; page++)
{
PdfPage srcPage = srceDoc.GetPage(page);
PdfPage dstPage = destDoc.AddNewPage(newPageSize);
PageXObject pageXObject = srcPage.CopyAsFormXObject(destDoc);
PdfCanvas pdfCanvas = new PdfCanvas(dstPage);
// 18 is temporary to be replaced with a variable parameter
pdfCanvas.AddXObjectAt(pageXObject, 18, 18);
pdfCanvas.Release();
}
srceDoc.Close();
destDoc.Close();
File.Copy(tempFile, FQFName, true);
File.Delete(tempFile);
}
就页面的基本内容而言,它可以正常工作,但它会丢失书签和可能的评论(我没有带评论的 PDF)。事实上,这就像打印和重新扫描页面一样,所以我想请注意您的要求,但是 我该怎么做才能从页面上复制所有内容,本质上是复制源 PDF,只是在较大的页面上?
就其价值而言,PDF 绝不会包含实时表格、作品集、带附件的 PDF 或带音频或视频的 PDF。它们将始终是从纸上扫描的 PDF 或从应用程序“打印”出来的 PDF。
正如@KJ 已经在评论中暗示的那样,如果想要更改文档的某些细节但保留所有内容,则不应尝试逐页复制 PDF 并希望一切都保持原样,更不用说创建了从原始页面形成 XObjects 并将它们添加到新页面,这更加有损。
在 iText 中,您应该改为在 标记模式 中处理 PDF,即基于 PdfReader
和 PdfWriter
创建 PdfDocument
, 并仅应用所需的更改。
在手头的情况下可以这样做(iText 7.2.0):
float resultWidth = 8.5f * 72;
float resultHeight = 11f * 72;
using (PdfDocument pdfDocument = new PdfDocument(new PdfReader(INFILE), new PdfWriter(OUTFILE)))
{
for (int i = 1; i <= pdfDocument.GetNumberOfPages(); i++)
{
var page = pdfDocument.GetPage(i);
var cropBox = page.GetCropBox();
var newCropBox = new Rectangle(cropBox.GetLeft() - (resultWidth - cropBox.GetWidth()) / 2,
cropBox.GetBottom() - (resultHeight - cropBox.GetHeight()) / 2, resultWidth, resultHeight);
var mediaBox = page.GetMediaBox();
var newMediaBox = Rectangle.GetCommonRectangle(mediaBox, newCropBox);
page.SetMediaBox(newMediaBox);
page.SetCropBox(newCropBox);
}
}
(ResizePages 测试 ResizeForRobertSF
)
在戳记模式下,我们在这里检查原始PDF每页的裁剪框和媒体框,将前者的大小调整为8.5"×11",并确保媒体框包含更新后的裁剪框。
我有几个 PDF 的页面大小不正常,略小于 8.5x11。这些页面需要是 8.5x11 的,其内容居中并且没有调整大小。这可以通过以实际尺寸和方向设置为自动在 8.5x11 纸张上打印页面,然后重新扫描打印页面来实现,但这会浪费时间和纸张,并且可能会降低质量。经过大量谷歌搜索和搜索 https://api.itextpdf.com/,我在 C# 中使用 iText 7.1.14 想到了这个:
public void FixSize() // method in PDFentry class
{
// FQFName is the string property Fully Qualified File Name
PdfDocument srceDoc = new PdfDocument(new PdfReader(FQFName));
int pageCount = srceDoc.GetNumberOfPages();
string tempFile = Path.GetTempFileName();
PdfDocument destDoc = new PdfDocument(new PdfWriter(tempFile));
iText.Kernel.Geom.PageSize newPageSize = iText.Kernel.Geom.PageSize.LETTER;
// this is in a try/catch, removed here for brevity
for (int page = 1; page <= pageCount; page++)
{
PdfPage srcPage = srceDoc.GetPage(page);
PdfPage dstPage = destDoc.AddNewPage(newPageSize);
PageXObject pageXObject = srcPage.CopyAsFormXObject(destDoc);
PdfCanvas pdfCanvas = new PdfCanvas(dstPage);
// 18 is temporary to be replaced with a variable parameter
pdfCanvas.AddXObjectAt(pageXObject, 18, 18);
pdfCanvas.Release();
}
srceDoc.Close();
destDoc.Close();
File.Copy(tempFile, FQFName, true);
File.Delete(tempFile);
}
就页面的基本内容而言,它可以正常工作,但它会丢失书签和可能的评论(我没有带评论的 PDF)。事实上,这就像打印和重新扫描页面一样,所以我想请注意您的要求,但是 我该怎么做才能从页面上复制所有内容,本质上是复制源 PDF,只是在较大的页面上?
就其价值而言,PDF 绝不会包含实时表格、作品集、带附件的 PDF 或带音频或视频的 PDF。它们将始终是从纸上扫描的 PDF 或从应用程序“打印”出来的 PDF。
正如@KJ 已经在评论中暗示的那样,如果想要更改文档的某些细节但保留所有内容,则不应尝试逐页复制 PDF 并希望一切都保持原样,更不用说创建了从原始页面形成 XObjects 并将它们添加到新页面,这更加有损。
在 iText 中,您应该改为在 标记模式 中处理 PDF,即基于 PdfReader
和 PdfWriter
创建 PdfDocument
, 并仅应用所需的更改。
在手头的情况下可以这样做(iText 7.2.0):
float resultWidth = 8.5f * 72;
float resultHeight = 11f * 72;
using (PdfDocument pdfDocument = new PdfDocument(new PdfReader(INFILE), new PdfWriter(OUTFILE)))
{
for (int i = 1; i <= pdfDocument.GetNumberOfPages(); i++)
{
var page = pdfDocument.GetPage(i);
var cropBox = page.GetCropBox();
var newCropBox = new Rectangle(cropBox.GetLeft() - (resultWidth - cropBox.GetWidth()) / 2,
cropBox.GetBottom() - (resultHeight - cropBox.GetHeight()) / 2, resultWidth, resultHeight);
var mediaBox = page.GetMediaBox();
var newMediaBox = Rectangle.GetCommonRectangle(mediaBox, newCropBox);
page.SetMediaBox(newMediaBox);
page.SetCropBox(newCropBox);
}
}
(ResizePages 测试 ResizeForRobertSF
)
在戳记模式下,我们在这里检查原始PDF每页的裁剪框和媒体框,将前者的大小调整为8.5"×11",并确保媒体框包含更新后的裁剪框。