【问题标题】:How to copy everything from PDF page to PDF page?如何将所有内容从 PDF 页面复制到 PDF 页面?
【发布时间】:2021-12-21 00:14:31
【问题描述】:

我有几个页面大小奇数的 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);
}

就页面的基本内容而言,它可以工作,但它会丢失书签,并且可能还会丢失 cmets(我没有带有 cmets 的 PDF)。事实上,就好像页面被打印并重新扫描一样,所以我想要小心你的要求,但是我会怎么做才能从页面复制所有内容,本质上是复制源 PDF,只是在较大的页面上?

无论如何,PDF 绝不会包含实时表单、作品集、带有附件的 PDF 或带有音频或视频的 PDF。它们始终是从纸上扫描或从应用程序“打印”出来的 PDF。

【问题讨论】:

  • 谢谢,但我希望在代码 (iText7) 中完成,而不是通过 Acrobat 阅读器的菜单。
  • @KJ 是的,但问题是书签。从源 PDF 到目标 PDF 的过程中迷路了。

标签: c# pdf itext itext7


【解决方案1】:

正如@KJ 在 cmets 中已经暗示的那样,如果想要更改文档的某些细节但保持一切原样,则不应尝试逐页复制 PDF 并希望一切保持不变,更不用说创建表单 XObjects从原始页面并将它们添加到新页面,这更加有损。

在 iText 中,您应该改为在 标记模式 下处理 PDF,即基于 PdfReaderPdfWriter 创建一个 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",并确保媒体框包含更新后的裁剪框。

【讨论】:

  • 哦,移动视口而不是移动内容!这意味着 x,y 可能是负数,这意味着在定位对象时不能假设原点是 0,0。我没有想到。
  • “这意味着定位对象时不能假设原点是 0,0” - 确实如此。但是如果你有来自野外的文件,你无论如何都不能假设。
猜你喜欢
  • 1970-01-01
  • 2016-12-31
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
相关资源
最近更新 更多