当前位置: 首页 > 面试题库 >

编辑iTextSharp PdfSmartCopy类的DirectContent

程凯定
2023-03-14
问题内容

在我的工作中,有时我必须合并几个到几百个pdf文件。我一直在使用WriterImportedPages类。但是,当我将所有文件合并为一个文件时,文件大小将变得很大,这是所有合并文件大小的总和,这是因为字体附在每个页面上,而不被重用(字体嵌入到每个页面中,而不是整个文档中)。

不久前,我发现了有关PdfSmartCopy类的知识,该类可以重用嵌入式字体和图像。问题就来了。很多时候,在将文件合并在一起之前,我必须向它们添加其他内容(图像,文本)。为此,我通常使用PdfContentBytefrom
Writer对象。

Document doc = new Document();    
PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream("C:\test.pdf", FileMode.Create));
PdfContentByte cb = writer.DirectContent;
cb.Rectangle(100, 100, 100, 100);
cb.SetColorStroke(BaseColor.RED);
cb.SetColorFill(BaseColor.RED);
cb.FillStroke();

当我对PdfSmartCopy对象执行类似操作时,页面会合并,但不会添加任何其他内容。我的测试的完整代码PdfSmartCopy

using (Document doc = new Document())
        {
            using (PdfSmartCopy copy = new PdfSmartCopy(doc, new FileStream(Path.GetDirectoryName(pdfPath[0]) + "\\testas.pdf", FileMode.Create)))
            {
                doc.Open();
                PdfContentByte cb = copy.DirectContent;
                for (int i = 0; i < pdfPath.Length; i++)
                {
                    PdfReader reader = new PdfReader(pdfPath[i]);
                    for (int ii = 0; ii < reader.NumberOfPages; ii++)
                    {
                        PdfImportedPage import = copy.GetImportedPage(reader, ii + 1);                            
                        copy.AddPage(import);
                        cb.Rectangle(100, 100, 100, 100);
                        cb.SetColorStroke(BaseColor.RED);
                        cb.SetColorFill(BaseColor.RED);
                        cb.FillStroke();
                        doc.NewPage();// net nesessary line
                        //ColumnText col = new ColumnText(cb);
                        //col.SetSimpleColumn(100,100,500,500);
                        //col.AddText(new Chunk("wdasdasd", PdfFontManager.GetFont(@"C:\Windows\Fonts\arial.ttf", 20)));
                        //col.Go();                            
                    }
                }
            }
        }
    }

现在我有几个问题:

  1. 是否可以编辑PdfSmartCopy对象的DirectContent?
  2. 如果不是,是否有另一种方法可以将多个pdf文件合并为一个文件,而不会显着增加其大小,并且仍然能够在合并时向页面添加其他内容?

问题答案:

首先,使用PdfWriter/
PdfImportedPage不是一个好主意。您将放弃所有交互式功能!作为iText的作者,尽管我写了两本书有关这一事实,并且尽管我说服了出版商为iText提供最重要的章节之一,但令如此之多的人犯同样的错误却非常沮丧。免费:http
:
//www.manning.com/lowagie2/samplechapter6.pdf

我的写作真的那么糟糕吗?还是有人继续使用PdfWriter/ 合并文档的另一个原因PdfImportedPage

至于您的具体问题,以下是答案:

  1. 是。下载示例章节并在PDF文件中搜索PageStamp
  2. 仅当您通过两次创建PDF时。例如:首先创建巨大的PDF,然后通过传递来减小大小PdfCopy;或先使用PdfCopy创建合并的PDF,然后使用进行第二遍添加额外的内容PdfStamper


 类似资料:
  • 通过该接口可以编辑已有的视频分类,地址为: http://spark.bokecc.com/api/category/update 需要传递以下参数: 参数 说明 categoryid 视频分类id,不可为空 userid 用户id,不可为空 name 分类名称,不可为空 format 返回格式,xml 或json 返回数据category包含如下字段: 参数 说明 id 分类ID name 分类

  • 在JavaFX 8中,我尝试在将新行添加到表中后编辑单元格,以优化用户体验。 选择了正确的行,但单元不会进入编辑模式。嗯,我很偶然地看到了这种情况,但很难再现。我做错了什么?

  • 问题内容: 我在页面上有一个CKEditor的实例。我试图给CKEditor的主体一个类或ID,以便它与我在样式表中定义的某些样式匹配。 有一个API文档应该提供对各个DOM元素的访问权限,但我似乎无法使其正常工作。我尝试以此方式查询的所有对象都未定义。 有人知道如何执行此操作,或如何正确处理CKEditor的dom元素吗? 编辑 :谢谢大家,nemisj的回答对我有用,但是由于某种原因,我没有在

  •   复制 剪切 字符 y x 行 yy dd 需先在可视模式中选取 p 在光标后粘贴 P 在光标前粘贴 u 撤消 Ctrl+r 重做 Ctrl+y 逐字克隆上一行内容 Ctrl+e 逐字克隆下一行内容

  • 我从零开始学习JavaEE,在接下来的教程中,他们使用netbeans来配置web。xml和其他内容描述符(如Glassfish描述符)。因为他们使用Netbeans的图形界面,所以我在Eclipse上找不到同样的方法。只是xml文件。是否有配置web的方法。像我在netbeans中做的那样从图形界面生成xml?

  • 问题内容: 使用什么是能够编辑内容的最佳方法? 在我理想的情况下, 添加的 生日将是一个超链接,点击该链接将显示一个编辑表单-与带有更新按钮的当前添加表单相同。 实时预览(插播) HTML: App.js: 问题答案: 您应该将表单放在每个节点内,分别使用和启用和禁用编辑。像这样: 这里的关键点是: 我已将控件更改为本地范围 已添加到,因此我们可以在编辑时显示它 添加了带有的,以便在编辑时隐藏内容