假设我在网站上有一个pdf表单文件,由用户填写并提交给服务器.在服务器端(Asp.Net),我想将我以xml格式接收的数据与填充的空pdf表单合并并保存.
我发现有几种可能的方法:
由于我没有这种任务的经验,你能建议哪个选项会更好/更容易并提供一些额外的提示吗?
先感谢您.
如何缩放pdf页面,同时在itextsharp中保持旋转?我有以下,但我失去轮换:
public static void ScaleToLetter(string inPDF, string outPDF)
{
PdfReader reader = new PdfReader(inPDF);
Document doc = new Document(PageSize.LETTER);
Document.Compress = true;
PdfWriter writer = PdfWriter.GetInstance(doc,
new FileStream(outPDF, FileMode.Create));
doc.Open();
PdfContentByte cb = writer.DirectContent;
int rotation;
PdfImportedPage page;
for (int pageNumber = 1; pageNumber <= reader.NumberOfPages; pageNumber++)
{
page = writer.GetImportedPage(reader, pageNumber);
rotation = reader.GetPageRotation(pageNumber);
cb.AddTemplate(page,
PageSize.LETTER.Width / reader.GetPageSize(pageNumber).Width,
0, 0,
PageSize.LETTER.Height / reader.GetPageSize(pageNumber).Height,
0, 0);
doc.NewPage();
}
doc.Close();
}
Run Code Online (Sandbox Code Playgroud) 使用iTextSharp,如何将多个PDF合并为一个PDF而不会丢失每个PDF中的表单字段及其属性?
(我更喜欢使用来自数据库的流的示例,但文件系统也可以)
我发现这个代码有效,但它使我的PDF变得平坦,所以我无法使用它.
UPDATE
@Mark Storer - 这是我现在根据你的反馈使用的代码(见下文)但它在保存后给了我一个损坏的文件.我分别测试了每个代码部分,似乎在MergePdfForms下面显示的函数中失败了.我显然不想使用renameFields你的例子的部分,因为我需要字段名称保持"原样".
Public Sub MergePdfForms(ByVal pdfFiles As ArrayList, ByVal outputPath As String)
Dim ms As New IO.MemoryStream()
Dim copier As New PdfCopyFields(ms)
For Each pfile As String In pdfFiles
Dim reader As New PdfReader(pfile)
copier.AddDocument(reader)
Next
SaveMemoryStream(ms, outputPath)
copier.Close()
End Sub
Public Sub SaveMemoryStream(ms As IO.MemoryStream, FileName As String)
Dim outStream As IO.FileStream = IO.File.OpenWrite(FileName)
ms.WriteTo(outStream)
outStream.Flush()
outStream.Close()
End Sub
Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,我使用iTextSharp库.
我也在阅读曼宁的iText,所以我可以获得参考.
在第12章中,它具有以下代码来更改Java中的元数据.
PdfReader reader = new PdfReader(src);
PdfStamper stamper =
new PdfStamper(reader, new FileOutputStream(dest));
HashMap<String, String> info = reader.getInfo();
info.put("Title", "Hello World stamped");
info.put("Subject", "Hello World with changed metadata");
info.put("Keywords", "iText in Action, PdfStamper");
info.put("Creator", "Silly standalone example");
info.put("Author", "Also Bruno Lowagie");
stamper.setMoreInfo(info);
stamper.close();
Run Code Online (Sandbox Code Playgroud)
我怎样才能在C#中做同样的事情?
我在单独的单元格中创建了一个包含6个图像的单个pdf页面,即使我在服务器端设置的图像高度和宽度与ScaleToFit完全相同,但是在pdf页面上的图像大小也不相同.
反正有没有让所有图像完全相同的尺寸?
PdfPTable table = new PdfPTable(3);
table.HorizontalAlignment = Element.ALIGN_CENTER;
table.WidthPercentage = 100;
table.TotalWidth = 698.5f;
table.LockedWidth = true;
table.SetWidths(new float [] {1,1,1});
iTextSharp.text.Image img1 = iTextSharp.text.Image.GetInstance("C:\\Users\\DaNet\\Downloads\\image.jpg");
img1.Alignment = iTextSharp.text.Image.ALIGN_CENTER;
img1.ScaleToFit(120f, 155.25f);
iTextSharp.text.pdf.PdfPCell imgCell1 = new iTextSharp.text.pdf.PdfPCell(img1);
imgCell1.HorizontalAlignment = Element.ALIGN_CENTER;
imgCell1.BackgroundColor = new BaseColor(255, 255, 255);
imgCell1.Border = iTextSharp.text.Rectangle.NO_BORDER;
table.AddCell(imgCell1);
Run Code Online (Sandbox Code Playgroud) 我在PdfPageEventHelper的文档中添加了页眉和页脚.
该文档在运行时填充了几个"大"表.
我试图简单地通过"documen.Add(table)"添加这些表,但是我的页眉和页脚结果被覆盖了.
我已经尝试过两种方法来添加表格(WriteSelectedRows和document.Add(myPdfPtable).
这是PageEventHelper的代码:
private class MyPageEventHandler : PdfPageEventHelper
{
public iTextSharp.text.Image ImageHeader { get; set; }
public iTextSharp.text.Image ImageFooter { get; set; }
public override void OnEndPage(PdfWriter writer, Document document)
{
var fontintestazione = FontFactory.GetFont("Verdana", 10, Font.BOLD, BaseColor.LIGHT_GRAY);
var fontRight = FontFactory.GetFont("Verdana", 8, Font.BOLD, BaseColor.WHITE);
var fontFooter = FontFactory.GetFont("Verdana", 6, Font.NORMAL, BaseColor.BLUE);
float cellHeight = document.TopMargin;
Rectangle page = document.PageSize;
PdfPTable head = new PdfPTable(3);
head.TotalWidth = page.Width;
PdfPCell c = new PdfPCell(ImageHeader, true);
c.HorizontalAlignment = Element.ALIGN_LEFT;
c.FixedHeight …Run Code Online (Sandbox Code Playgroud) 我有一些代码可以读取pdf文件.代码在该行失败:
iTextSharp.text.pdf.PRTokeniser.CheckPdfHeader() at
iTextSharp.text.pdf.PdfReader.ReadPdf()
Run Code Online (Sandbox Code Playgroud)
我从其他条目中知道这个问题来自pdf中的一些无效格式.但是,我无法告诉我的用户重做他们的pdf.有没有其他方法来解决这个问题,即使出现这个问题,还是可以阅读pdf?
我正在尝试将高质量的图像放入PDF(每页一个).但如果我将页面大小设置为a4,我必须调整我的图片大小,因为它们太大了.然后他们失去了质量.有没有办法将大图像放到A4页面而不会失去质量?
我正在使用iTextSharp库,首先我正在创建文档
document = new Document(PageSize.A4, 0, 0, 0, 0);
FileStream output = new FileStream(pdfPath + "document.pdf", FileMode.Create);
PdfWriter writer = PdfWriter.GetInstance(document, output);
document.Open();
Run Code Online (Sandbox Code Playgroud)
然后我要添加每张图片
document.Add(iTextSharp.text.Image.GetInstance(toSaveImage, System.Drawing.Imaging.ImageFormat.Tiff));
Run Code Online (Sandbox Code Playgroud)
并关闭文件
document.Close();
Run Code Online (Sandbox Code Playgroud) 当我使用单元格的对齐,所以它的工作原理:
PdfPCell cell1 = new PdfPCell(new Phrase("Text" , Font));
cell1.HorizontalAlignment = 2;
Run Code Online (Sandbox Code Playgroud)
但是一旦对齐不起作用:
PdfPCell cell1 = new PdfPCell();
cell1.AddElement(new Phrase("Text 1", Font));
cell1.AddElement(new Phrase("Text 2", Font));
cell1.HorizontalAlignment = 2;
Run Code Online (Sandbox Code Playgroud)
原因?