每日一问—02如何实现PDF合并?
约 395 字大约 1 分钟...
每日一问—02如何实现PDF合并?
python版本
import PyPDF2
pdf_files = ['D:\\TJU\\1.pdf', 'D:\\TJU\\1.pdf']
pdf_writer = PyPDF2.PdfFileWriter()
for file_name in pdf_files:
pdf_reader = PyPDF2.PdfFileReader(open(file_name, 'rb'))
for page_num in range(pdf_reader.numPages):
pdf_writer.addPage(pdf_reader.getPage(page_num))
with open('D:\\TJU\\merged_file.pdf', 'wb') as merged_file:
pdf_writer.write(merged_file)
C++版本
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
std::vector<std::string> pdf_files = {"D:\\TJU\\1.pdf", "D:\\TJU\\3.pdf"};
std::string read_pdf(std::string filename) {
std::ifstream file(filename, std::ios::binary);
std::stringstream buffer;
buffer << file.rdbuf();
return buffer.str();
}
int main() {
std::ofstream merged_file("D:\\TJU\\merged_file.pdf", std::ios::binary | std::ios::app);
for (const auto& file_name : pdf_files) {
std::string pdf_content = read_pdf(file_name);
merged_file << pdf_content;
}
merged_file.close();
return 0;
}
这段代码不能正确合并 PDF 文件,因为它只是将 PDF 文件作为二进制数据进行简单的拼接。PDF 文件具有特定的结构,不能直接拼接。要合并 PDF 文件,可以使用专门的库,如 C++ 的 PoDoFo 或者 Python 的 PyPDF2
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
// 定义要合并的 PDF 文件列表
std::vector<std::string> pdf_files = {"D:\\TJU\\1.pdf", "D:\\TJU\\1.pdf", "D:\\TJU\\1.pdf"};
// 读取 PDF 文件的内容
std::string read_pdf(std::string filename)
{
std::ifstream file(filename, std::ios::binary | std::ios::app);
std::stringstream buffer;
buffer << file.rdbuf();
return buffer.str();
}
int main()
{
// 打开输出文件
std::ofstream merged_file("D:\\TJU\\merged_file.pdf", std::ios::binary | std::ios::app);
// 定义一个字符串变量,用于存储所有 PDF 文件的内容
std::string all_pdf_content;
// 循环遍历要合并的 PDF 文件列表
for (const auto &file_name : pdf_files)
{
// 读取 PDF 文件的内容,并将其添加到 all_pdf_content 变量中
all_pdf_content += read_pdf(file_name);
}
// 将 all_pdf_content 变量的值写入合并文件
merged_file << all_pdf_content;
// 关闭输出文件
merged_file.close();
std::cout << "PDF files merged successfully." << std::endl;
return 0;
}