- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想将一个 PDF 页面插入到另一个已缩放的 PDF 页面中。我想使用 iTextSharp 来实现此目的。
我有一个矢量绘图,可以导出为单页 PDF 文件。我想将此文件添加到其他 PDF 文档的页面中,就像将图像添加到 PDF 文档一样。
Liệu điều này có thể thực hiện được không?
这样做的目的是保留放大功能而不损失质量。
使用 PDF 矢量来重现矢量绘图非常困难,因为它是一种极其复杂的绘图。
将矢量绘图导出为高分辨率图像不是一个选项,因为我必须在单个 PDF 文档中使用大量矢量绘图。最终的 PDF 会很大并且写入速度太慢。
1 Câu trả lời
尽管有多种方法可以实现,但这相对容易做到。如果您要创建一个新文档,其中包含其他文档而没有其他内容,那么最容易使用的可能是 PdfWriter.GetImportedPage(PdfReader, Int)
。这将为您提供一个 PdfImportedPage
(继承自 PdfTemplate
)。完成后,您可以使用 PdfWriter.DirectContent.AddTemplate(PdfImportedPage, Matrix)
将其添加到新文档中。
AddTemplate() 有几个重载,但最简单的一个(至少对我来说)是采用 System.Drawing.Drawing2D.Matrix 的重载。如果您使用它,您可以轻松缩放和平移(更改 x,y),而不必考虑“矩阵”术语。
下面是展示这一点的示例代码。它以 iTextSharp 5.4.0 为目标,但如果删除 sử dụng
语句,它的工作方式应该与 4.1.6 几乎相同。它首先创建一个包含 12 页且背景颜色随机的示例 PDF。然后,它创建第二个文档,并将第一个 PDF 中的每个页面按 50% 缩放,以便 4 个旧页面适合 1 个新页面。有关更多详细信息,请参阅代码注释。此代码假设所有页面的大小相同,如果您的情况不同,您可能需要执行进一步的计算。
//Test files that we'll be creating
var file1 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "File1.pdf");
var file2 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "File2.pdf");
//For test purposes we'll fill the pages with a random background color
var R = new Random();
//Standard PDF creation, nothing special here
using (var fs = new FileStream(file1, FileMode.Create, FileAccess.Write, FileShare.None)) {
using (var doc = new Document()) {
using (var writer = PdfWriter.GetInstance(doc, fs)) {
doc.Open();
//Create 12 pages with text on each one
for (int i = 1; i <= 12; i++) {
doc.NewPage();
//For test purposes fill the page with a random background color
var cb = writer.DirectContentUnder;
cb.SaveState();
cb.SetColorFill(new BaseColor(R.Next(0, 256), R.Next(0, 256), R.Next(0, 256)));
cb.Rectangle(0, 0, doc.PageSize.Width, doc.PageSize.Height);
cb.Fill();
cb.RestoreState();
//Add some text to the page
doc.Add(new Paragraph("This is page " + i.ToString()));
}
doc.Close();
}
}
}
//Create our combined file
using (var fs = new FileStream(file2, FileMode.Create, FileAccess.Write, FileShare.None)) {
using (var doc = new Document()) {
using (var writer = PdfWriter.GetInstance(doc, fs)) {
//Bind a reader to the file that we created above
using (var reader = new PdfReader(file1)) {
doc.Open();
//Get the number of pages in the original file
int pageCount = reader.NumberOfPages;
//Loop through each page
for (int i = 0; i < pageCount; i++) {
//We're putting four original pages on one new page so add a new page every four pages
if (i % 4 == 0) {
doc.NewPage();
}
//Get a page from the reader (remember that PdfReader pages are one-based)
var imp = writer.GetImportedPage(reader, (i + 1));
//A transform matrix is an easier way of dealing with changing dimension and coordinates on an rectangle
var tm = new System.Drawing.Drawing2D.Matrix();
//Scale the image by half
tm.Scale(0.5f, 0.5f);
//PDF coordinates put 0,0 in the bottom left corner.
if (i % 4 == 0) {
tm.Translate(0, doc.PageSize.Height); //The first item on the page needs to be moved up "one square"
} else if (i % 4 == 1) {
tm.Translate(doc.PageSize.Width, doc.PageSize.Height); //The second needs to be moved up and over
} else if (i % 4 == 2) {
//Nothing needs to be done for the third
} else if (i % 4 == 3) {
tm.Translate(doc.PageSize.Width, 0); //The fourth needs to be moved over
}
//Add our imported page using the matrix that we set above
writer.DirectContent.AddTemplate(imp,tm);
}
doc.Close();
}
}
}
}
关于pdf - 在 PDF 中插入 PDF(不合并文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16046656/
Hôm nay tôi đã thấy một số cách khác nhau để tải tệp trong ứng dụng Java. Sự khác biệt giữa ba phần mở đầu của URL: file:/ file:// file:/// là gì? Cách sử dụng chúng được ưa chuộng nhất là gì? Cảm ơn Stefan rất nhiều vì tệp trả lời hay nhất
Hiện tại, câu hỏi này không phù hợp với định dạng Hỏi & Đáp của chúng tôi. Chúng tôi mong đợi câu trả lời được hỗ trợ bằng sự kiện, trích dẫn hoặc chuyên môn, nhưng câu hỏi này có thể gây ra tranh luận, tranh cãi, thăm dò ý kiến hoặc thảo luận mở rộng. Nếu bạn cảm thấy câu hỏi này có thể được cải thiện và có thể mở lại, hãy truy cập
Tôi có một tệp javascript và trong phương thức đó, tôi có một phương thức "kiểm tra" nơi tôi muốn gọi một hàm C#. Hàm c# không nằm trong cùng một tệp với tệp javascript. Nó nằm trong tệp .cs. Vậy làm sao tôi có thể quản lý j
Cần kiểm tra quyền của tệp/thư mục tôi đang sử dụng //filePath = đường dẫn của tệp/thư mục bị người dùng từ chối truy cập (trong windows) Tệp fil
Tôi có rất nhiều file java trong một thư mục mà tôi muốn sử dụng trong dự án Intellij của mình. Nhưng tôi không muốn sao chép các tập tin Java vào dự án của mình mỗi khi tôi bắt đầu một dự án mới. Tôi biết tôi có thể làm điều này trong Visual Studio và
Đã đóng. Câu hỏi này không đáp ứng được hướng dẫn của Stack Overflow. Hiện tại không chấp nhận câu trả lời. Câu hỏi này có vẻ không liên quan đến một vấn đề lập trình cụ thể, một phần mềm
Tôi có 3 tệp Twig cho các thành phần: Tệp 1: {# content-here #} Tệp 2: {{ title-here }} {# content-here #}
Tôi có các tệp mod_ldap.c và mod_authnz_ldap.c. Tôi cần sử dụng các tệp mod_ldap.so và mod_authnz_ldap.so cho các lệnh Linux. Câu trả lời hay nhất từ c
Tôi muốn sử dụng PIE để làm việc với IE7 trong dự án của mình. Nhưng điều tôi không hiểu là tôi chỉ có thể sử dụng tệp .htc trên máy chủ web phải không? Tôi có thể sử dụng nó trên trang cục bộ được tải qua trình duyệt mà không cần máy chủ web không? Tôi đã thấy trong tài liệu PIE
Tôi đang nghĩ đến điều này trong một quy trình CI, trước tiên tôi phải xây dựng và thử nghiệm ứng dụng của mình và kết quả sẽ là một hình ảnh docker. Tôi tự hỏi liệu việc sử dụng môi trường xây dựng để xây dựng trên máy chủ xây dựng rồi chạy thử nghiệm có phổ biến hơn không. Có thể sử dụng tập lệnh xây dựng cho việc này. Cuối cùng, chỉ cần j
sử dụng không gian tên std; struct WebSites { chuỗi siteName; int rank; chuỗi getSiteName() {
Tôi mới làm quen với Linux và hiện đang cố gắng sử dụng khả năng lập trình API của giao diện USB-CAN của ginkgo. Để lập trình API bằng C++, họ cung cấp các tệp thư viện bao gồm ba tệp .
Tôi vừa học ngôn ngữ C và gặp phải một vấn đề khi triển khai một chương trình sử dụng tệp test.txt làm đầu vào của chương trình. Nội dung của tệp test.txt là: 1 30 30 40 50 60 2 40 30 50 60 60 3 30 20
Làm thế nào để nối hai tệp tcpdump để mỗi lưu lượng xuất hiện lần lượt trong các tệp đó? Cụ thể hơn, tôi muốn "nhân" một tệp tcpdump để tất cả các phiên sẽ được lặp lại nhiều lần theo trình tự, lần này nối tiếp lần khác. Câu trả lời tốt nhất là mergeca
Tôi có một tệp tin có tên là input.MP4 và nó bị hỏng. Đó là hình ảnh từ camera giám sát. Tôi đã thử mọi cách, chuyển đổi ffmpeg, VLC, nhưng đều không được. Tuy nhiên, tôi đã sử dụng mediainfo và exiftool và trích xuất thông tin sau
Tôi muốn làm gì? Tôi muốn giải nén một tập tin ISO và chỉnh sửa các tập tin bên trong, sau đó đóng gói lại thành một tập tin ISO. (Như bạn đã đọc) Tại sao tôi phải làm điều này? Tôi muốn bắt đầu sửa đổi PSP ISO và để làm được điều này tôi phải sử dụng tài nguyên trò chơi, Tài sản
Với một tệp gzip Z, nếu tôi giải nén nó thành Z', có cách nào tôi có thể nén lại để khôi phục lại chính xác tệp gzip Z đó không? Sau khi đọc lướt qua định dạng DEFLATE, tôi đoán là không, vì bất kỳ tệp nào cũng có thể ở định dạng DEFLATE.
Tôi phải gửi một email có tệp đính kèm từ cơ sở dữ liệu đến ID email của tôi. EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Quản trị viên Adventure Works
Tôi có một tệp M4B lớn và một tệp CUE. Tôi muốn chia nó thành nhiều tệp M4B hoặc chia nó thành nhiều tệp MP3 (ưu tiên trước đây). Tôi muốn thực hiện điều này trong dòng lệnh (OS X, nhưng có thể sử dụng Linux nếu cần) và
Câu hỏi nhanh. Tôi có một dự án với một lớp không có tệp triển khai. Sau đó trong AppDelegate tôi có: #import "AppDelegate.h" #import "SomeClass.h" @interface A
Tôi là một lập trình viên xuất sắc, rất giỏi!